Индикатор выполнения во время выполнения команды unix find - PullRequest
0 голосов
/ 18 октября 2019

У меня есть простой скрипт оболочки Unix, который выполняет команду поиска, отнимающую много времени. Пока он исполняется, мой скрипт не отвечает. Однако это на самом деле работает в реальности. Как добавить индикатор выполнения или распечатать точки, пока не будет выполнена команда поиска?

Я хочу напечатать несколько точек или хэш, пока не выполняется функция doSomething.

function doSomething()
{
  # time consuming for loop below
  for var in `find XXXXXX`
  do
      #some more processing
  done;
}

#call the function doSomething. Need the progress DOTS till doSomething is executing
doSomething

# remaining script processing

Я пыталсяGoogle, но ни одно из решений не соответствует тому, что я пытаюсь достичь. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Вы можете запустить спиннер в фоновом режиме

#!/usr/bin/env bash

spinner() {
  local s="|/-\\"
  local -i i=0
  while :; do
    printf "%s\\r" "${s:$((i++%4)):1}" >&2
    sleep .05
  done
}

function doSomething()
{
  # time consuming for loop below
  # See: https://github.com/koalaman/shellcheck/wiki/SC2044
  for var in $(find XXXXXX)
  do
    : #some more processing
  done
}

# Start the spinner in the background
spinner &

# Get the spinner PID
spinner_pid=$!
#call the function doSomething. Need the progress DOTS till doSomething is executing
doSomething

# Terminate the background running spinner
kill $spinner_pid

# remaining script processing

0 голосов
/ 18 октября 2019

Как предлагается в комментариях, как насчет простого блесна? В awk достаточно легко что-то сбить, что копирует входные данные в стандартный вывод и печатает счетчик со стандартной ошибкой:

$ cat spinner.awk
{ printf "%s\r", substr("|/-\\", NR % 4 + 1, 1) > "/dev/stderr" }

1

, которую затем можно передать по каналу find.

  for var in `find XXXXXX | awk -f spinner.awk`
  do
      #some more processing
  done;
...