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

Предположим, у вас есть переменная t1 , которая содержит набор значений, разделенных запятыми:

t1=$(GetValueOfT1)    # For example t1='123,456,789'

Вы можете применить каждое из них по очереди с помощью такого цикла

OIFS="$IFS" IFS=,
for v in $t1
do
    echo "Processing with v=$v:" >&2
    mv "$SRC_PATH/ABC_${v}.dat" "$DEST_PATH/ABC_${v}_$$.dat"
done
IFS="$OIFS"

Первый $ t1 нельзя заключать в кавычки, потому что оболочка должна разделять значение по символам запятой. (Это контролируется переменной оболочки $ IFS , которую мы сохраняем, чтобы мы могли восстановить ее в конце цикла.) Все остальные переменные должны быть заключены в кавычки, чтобы защитить их от неожиданного разделения слов на пробелы. , запятые и т. д. Наконец, вы должны представить $ v как $ {v} , потому что в противном случае оболочка будет включать следующий за ним символ _ как часть имя переменной, а $ v_ - это не то, что нам нужно.

Я бы порекомендовал вам префикс mv с помощью echo (т.е. echo mv ... ), прежде чем запускать это на практике, чтобы вы могли проверить вывод, прежде чем он что-либо изменит.

1
23.05.2017, 15:39
2 ответа

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

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

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

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

2
27.01.2020, 23:25

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

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

Пример

enter image description here

Еще один вариант, который не всегда доступен, — обновлять индикатор выполнения не в зависимости от времени, а в определенных точках вашего скрипта.

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

1
27.01.2020, 23:25

Теги

Похожие вопросы