индикатор выполнения, чтобы узнать, сколько выполнено выход скрипта оболочки

У меня есть следующий shell-скрипт от очистки вывода скрипта, так что он спускается, дает имена пакетов и чисто существует –

┌─[shirish@debian] - [~] - [6348] └─[$] cat find-interesting-patches.sh for source in $(dpkg-query --show -f \ '${source:Package}\n' | sort -u); do bts \ select source:${source} tag:patch \ | sed "s/^/${source} /g"; done 

и я получаю вывод на stdout.

  • Чтение нескольких записей из входного файла
  • Debian Jessie GRUB2 на многопользовательском ноутбуке EFI не может запускать ядро-initramf для Gentoo
  • zsh Интерпретировать / игнорировать команды, начинающиеся с '#' в качестве комментариев
  • что запускает runv в системе Debian, используя init и как?
  • zsh: удалить предсказанный текст
  • Использование уведомления-отправки с помощью cron
  •  ┌─[shirish@debian] - [~] - [6349] └─[$]./find-interesting-patches.sh 2048-qt 781691 abootimg 725728 accountsservice 805989 acl 677570 acpi 772688 acpi-support 823072 acr 772194 

    Теперь я знаю, что количество пакетов конечно, например, это 4k и немного больше от выполнения

     $dpkg -l > dpkg-l.txt 

    а потом

     $wc dpkg-l.txt 

    который дает номера строк, nummber слов весь she-bang.

    Когда я запускаю сценарий, есть способ получить индикатор выполнения, поэтому я знаю, сколько из него было выполнено. Я просмотрел https://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script#238094 и пробовал некоторые вещи, но они не работали. Например, я попробовал pv, и это не получилось эффектно –

     ┌─[shirish@debian] - [~] - [6353] └─[$] pv ./find-interesting-patches.sh for source in $(dpkg-query --show -f \ '${source:Package}\n' | sort -u); do bts \ select source:${source} tag:patch \ | sed "s/^/${source} /g"; done 153 B 0:00:00 [9.09KiB/s] [=================================================================================================>] 100% 

    Не то, что я ожидал, кто-нибудь знает, что я делаю неправильно?

  • Могу ли я дать двум клавиатурам разные макеты?
  • Как перебирать переменную, пропуская одно из значений?
  • Как настроить файл my.cfg для mysql, который был установлен из источников?
  • обмена или синхронизации истории между Zsh и Bash
  • Помогите мне, пожалуйста, найти мое недоразумение об этом маленьком фрагменте скрипта
  • Сценарий Bash с использованием pdfencrypt не работает для определенных символов
  • 2 Solutions collect form web for “индикатор выполнения, чтобы узнать, сколько выполнено выход скрипта оболочки”

    Когда вы даете pv файл в качестве аргумента командной строки, он действует как cat и отображает файл, и отслеживает ход этого вывода, и это то, что вы видите. Эта форма полезна, если вы используете pv для подачи файла на медленный процесс (используя канал); в manpage есть примеры.

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

     dpkg-query --show -f '${source:Package}\n' | sort -u 

    к файлу и используя pv для подачи этого значения для вызова вызова bts select , но полученный файл настолько короток, что он получает буферизацию, и pv считает, что он был обработан до начала фактической обработки.

    Поэтому вам нужно отслеживать прогресс вручную:

     #!/bin/sh file=$(mktemp) dpkg-query --show -f '${source:Package}\n' | sort -u > ${file} lines=$(wc -l ${file} | cut -f1 -d\ ) line=0 while read source; do line=$((line + 1)) printf "Processing line %d / %d\r" ${line} ${lines} >&2 bts select source:${source} tag:patch | sed "s/^/${source} /g" done < ${file} | sort -k2,2n -r rm ${file} echo "Done " >&2 

    Я позволю вам адаптировать это, чтобы использовать хороший индикатор выполнения, используя примеры в разделе Как добавить индикатор выполнения в сценарий оболочки? ,

    Если вы запустите команду, вы можете использовать эту индикацию выполнения

    Это происходит с использованием символов полублока

    пример

    введите описание изображения здесь

    Другой вариант, который не всегда доступен, – это обновить индикатор выполнения не по времени, а в определенных точках вашего скрипта.

    code set_progress 10 code set_progress 20 ... code set_progress 100

    Linux и Unix - лучшая ОС в мире.