Вопрос или проблема
Как я могу правильно отобразить прогресс curl в диалоговом окне?
curl http://mysite.corp/image/root_21.tar.bz2 | tar -C /mnt/dest/ -jxf -
Я пробовал эту команду, но, как вы видите, она отображается неправильно.
curl -f -x '' -L http://mysite.corp/image/root_21.tar.bz2 | tar -C /mnt/dest -xjpf - --exclude="dev/*" | dialog --backtitle "dialog" --stderr --title 'Linux Image' --textbox /tmp/log 30 80
Эта команда почти мне помогает, но я хочу, чтобы она перезаписывала себя и не отображала новый прогресс на каждой строке. В основном, я хочу, чтобы это выглядело так же, как в оригинальной команде, но в диалоговом окне.
(curl -f -x '' -L http://mysite.corp/image/root_21.tar.bz2 | tar -C /mnt/dest -xjpf - --exclude="dev/*" ) 2>&1 | dialog --progressbox 20 120
Вы можете использовать опцию --progressbox
диалога так:
(curl ... | tar ... ) 2>&1 | dialog --progressbox 30 120
2>&1
перенаправляет вывод stderr curl
и tar
на stdin,
т.е. на трубопровод к dialog
.
Перезапись строк (управляющий символ: CR ‘\r’ (возврат каретки))
не поддерживается dialog
, поэтому вы получаете каждое изменение прогресса
в отдельной строке.
При загрузке с помощью curl и перенаправлении на tar простой прогресс можно вывести с помощью:
–checkpoint[=NUMBER] отображать сообщения о прогрессе каждые NUMBER-й запись
–checkpoint-action=ACTION выполнять ACTION на каждой контрольной точке
Например, эта команда загрузит и извлечет gz файл, печатая точку каждые 10 контрольных точек:
curl -s -L $url | tar -xz --checkpoint=.10
Чтобы увидеть больше деталей во время прогресса:
- Удалите “-s” из команды curl, если вы не хотите, чтобы curl выводил “тихий” вывод.
- Добавьте “-v” к команде tar, чтобы распечатать список файлов, извлекаемых из архива.
dialog --gauge 'Начальный текст' высота ширина
ожидает ввод, как 12
, который дает текущий процент, но также может принимать ввод вида:
XXX
12
Некоторый текст для отображения
в окне
XXX
Где Некоторый текст...
заменяет Начальный текст
для каждого обновления.
Таким образом, вы можете отформатировать вывод прогресса curl
следующим образом:
export URL=https://...
{
{
curl "$URL" 2>&3 3>&- |
tar ... 3>&-
} 3>&1 >&4 4>&- |
perl -C -lane '
BEGIN {$header = "Загрузка $ENV{URL}...\n\n"; $| = 1}
$pcent = $F[0];
$_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
s/ /\xa0/g; # замена пробела на nbsp, так как dialog сжимает пробелы
if ($. <= 3) {
$header .= "$_\n";
$/ = "\r" если $. == 2
} else {
print "XXX\n$pcent\n$header$_\nXXX"
}' 4>&- |
dialog --gauge "Готовимся к загрузке $URL..." 14 72 4>&-
} 4>&1
Что дает что-то вроде:
Ответ или решение
Для корректного отображения прогресса загрузки cURL в диалоговом окне нужно учесть, что стандартный вывод и поведение команды cURL с использованием --progress
не поддерживают перезапись строк в диалоговом окне. Вместо этого можно воспользоваться различными подходами, чтобы обрабатывать вывод и отображать его в dialog
как прогресс.
Решение 1: Использование --gauge
dialog
предоставляет возможность отображать индикатор выполнения с помощью команды --gauge
. Вы можете передавать процент выполнения и текст для обновления в диалоговом окне. Простой подход будет выглядеть так:
export URL=http://mysite.corp/image/root_21.tar.bz2
{
{
curl -s -L "$URL" | tar -C /mnt/dest -xjpf - --exclude="dev/*"
} 2>&1 | while IFS= read -r line; do
if [[ "$line" =~ ([0-9]+)% ]]; then
percent="${BASH_REMATCH[1]}"
echo "XXX"
echo "$percent"
echo "Загрузка файла: $percent%"
echo "XXX"
fi
done
} | dialog --gauge "Загрузка в процессе..." 10 70
Решение 2: Применение --checkpoint
Вы также можете использовать параметры --checkpoint
и --checkpoint-action
в cURL для отображения точек проверки во время загрузки:
curl --progress-bar --checkpoint=10 --checkpoint-action=display --output /mnt/dest/root_21.tar.bz2 "$URL" && \
tar -C /mnt/dest -xjpf /mnt/dest/root_21.tar.bz2 --exclude="dev/*" | dialog --progressbox "Распаковка..." 20 80
Решение 3: Форматирование вывода
Для более сложного управления выводом можно использовать awk
или perl
, чтобы преобразовать вывод в формат, подходящий для dialog
:
{
curl -s -L "$URL" 2>&1 | tar -C /mnt/dest -xjpf - --exclude="dev/*" 2>&1 | \
perl -C -lane 'BEGIN { $| = 1; } if (/(\d+\.\d+)/) { print "XXX\n$1\nТекущая загрузка: $1%\nXXX"; }'
} | dialog --gauge "Загрузка..." 10 70
Заключение
Использование диалога для отображения прогресса загрузки требует некоторой предобработки вывода команд. Каждый из представленных подходов имеет свои плюсы, и выбор зависит от вашего конкретного случая. Также, если вы обрабатываете много данных, учтите нагрузку на процессор и производительность скрипта.
Эти решения позволяют эффективно отображать прогресс загрузки файлов через dialog
, сохраняя при этом информативное взаимодействие с пользователем.