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

У меня есть следующий 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.

 ┌─[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% 

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

  • Пробелы как разрывы строк из команды inline for loop
  • Ошибка перехвата «команда не найдена» в zsh
  • Могу ли я использовать `rm` только при использовании globbing? (либо в bash, либо в zsh, либо в обоих)
  • Что такое sourcing мой сценарий оболочки?
  • расширение псевдонима zsh
  • Почему эта команда ffmpeg работает в bash, а не zsh?
  • Ruby Version Prompt (Oh My ZSH) не работает вне TMUX
  • Почему вырезать провал с bash, а не zsh?
  • 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 - лучшая ОС в мире.