Как я могу создать индикатор выполнения с помощью bash?
Это мой сценарий:
#!/bin/bash
pass='number1 number12 number13 number14 number15 number16'
chk='number14'
for i in $pass ; do
if [ "$i" == "$chk" ]; then
echo ' Found ^_^'
else
echo 'loading 50%'
fi
done
Я хочу заменить echo 'loading 50%'
что-нибудь, чтобы создать индикатор выполнения.
command-line
bash
Черный ястреб
источник
источник
eta
Может делать то , что вы хотите.Ответы:
whiptail
поставляется предустановленным в Ubuntu и многих других дистрибутивах и будет отображать полноэкранные (но все еще основанные на терминалах) элементы прогресса.dialog
является надмножествомwhiptail
, так что этот пример будет одинаково хорошо работать с обоими. Он предоставляет более продвинутые элементы пользовательского интерфейса, поэтому он может пригодиться, если вы ищете взаимодействие с пользователем, такое как средства выбора файлов и формы, но его недостатком является то, что он не предустанавливается во многих системах.Обратите внимание, что вывод сценария интерпретируется в процентах, поэтому вам, возможно, придется соответствующим образом настроить вывод.
Whiptail и Dialog также позволяют вам изменять текст во время выполнения с помощью довольно загадочного синтаксиса:
pv
показывает прогресс файла или потока, проходящего через него. Однако его нельзя (легко?) Использовать для отображения прогресса пользовательской операции, такой как цикл. Он разработан специально для потоков.Некоторые примеры из реальной жизни, где это
pv
пригодится:Я не знаю ни одной команды, которая выдает однострочные индикаторы выполнения в стиле
pv
илиwget
, но есть много простых скриптов Bash / Perl / sed, которые добавят эту функциональность, как и другие здесь поделились.источник
pv
вами, вы можете либо заставить его искать выходные данные цикла, либо создать какой-то фальшивый вывод, например,echo
в каждой итерации, направить егоpv
и передать ему счетчик итераций-s
. Если он не нужен, не забудьте перенаправить стандартный вывод цикла/dev/null
. Вот пример, показывающий этот подход .Вы можете использовать
zenity
для создания простых диалоговых окон GTK. Одним из доступных вариантов является диалоговое окно индикатора выполнения.Вы создаете такое окно, используя
zenity --progress
. Чтобы сделать его полезным, вы должны указать дополнительную информацию, добавив некоторые из параметров ниже (выдержка изman zenity
):Есть два режима:
пульсирующий : индикатор выполнения пульсирующий, он просто указывает на то, что что-то работает, но ничего не говорит о прогрессе. Вы делаете это, устанавливая
--pulsating
опцию.manual : необходимо
zenity
обновить текущий процент выполнения для стандартного ввода команды, чтобы обновить индикатор выполнения.Пример для этого может выглядеть следующим образом. Обратите внимание, что предыдущие команды сгруппированы в подоболочку, так что весь вывод перенаправляется в
zenity
диалог, а не только в последнюю команду:источник
[ ###########--------------] 52%
Этот код сделает это, и ничего не требует (кроме bash, конечно). Он печатает
#
знаки, как вы и просили в своем комментарии:Однако, если вам есть что проверить, это просто заполнит ваш экран
#
знаками. Чтобы решить эту проблему, попробуйте этот код:Измените 5 в первой строке (
lenProgressBar=5
) на длину, которую вы хотите, чтобы ваш индикатор выполнения был. Печатается#
знак с полосами выполнения меньшей длины, чем с полосами большей длины, но не позволяйте длине индикатора выполнения превышать размер экрана; это не будет работать хорошо, если вы делаете. (Это не позволит вам использовать индикатор выполнения больше, чем количество проверяемых элементов или меньше 1)источник
tput cols
для определения ширины окна терминала и соответственно масштабировать индикатор выполнения.Вот еще один подход с использованием escape-кодов ANSI:
источник