Можно ли перезагрузить переменную в команде наблюдения?

Можно ли перезагрузить переменную в команде наблюдения?

Часть моей работы включает в себя обработку данных. Одна из задач — «сгладить» набор каталогов (который мы назовемРежиссёр(на данный момент) и скопируйте их в новое место под названием DirFlat.

Это может занять много времени (30 минут ->2-3 часа)! Я хотел бы иметь возможность следить за ходом процесса, поэтому я использую , find Dir -type f|wc -lчтобы получить количество файлов (назовем это $Filenum, а затем запускаю очень короткую команду, которую я написал (перепечатываю из своего блокнота, возможно, скопировал неправильно, надеюсь, вы уловили суть):

echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)

Однако если я запущу его, watch -n 100 "!!"он возьмет вывод echo и продолжит его печатать (даже дата не изменится).

Могу ли я получить это для обновления переменной/повторного запуска назначения внутренних переменных в BASH? Надеюсь, это поможет мне автоматизировать некоторые из моих задач.

решение1

Контраст:

$ watch -n 1 "echo $(date)"
Every 1.0s: echo Sat Apr 27 03:10:50 CEST 2013

$ watch -n 1 'echo $(date)'
Every 1.0s: echo $(date)

То, что вы сделали, это запустили echo "($ls DirFlat |wc -l)*100/$FileNum"|bcи date, подставили вывод каждой команды в оболочку command watch -n 100 "echo $(…) % $(…)"и запустили ее. Вам нужно предотвратить расширение команды в родительской оболочке и вместо этого передать ее как строку для watchее запуска. Это просто вопрос использования одинарных кавычек вокруг команды вместо двойных.

решение2

В качестве альтернативы вы можете обернуть его в цикл оболочки:

while sleep 100; do
    (... your stuff ...)
    if [ (... process has finished ...) ]; then
        (... beep or get operator's attention otherwise ...)
        break
    fi
done

решение3

Вам нужно поместить это в скрипт оболочки и позволить watch затем вызывать этот скрипт.

решение4

Цикл while с командой, которую вы хотите запустить, и командой sleep также позволит вам многократно запускать команду linux, как и команду watch. Хотя в этом конкретном случае ответ @peterph лучше, так как в нем есть условие завершения. Этот более короткий ответ отвечает только на вопрос о том, как обновиться при повторном запуске того же процесса.

while true; do echo $(date +"%T"); sleep 1; done

Число после сна указывается в секундах.

Связанный контент