Bash и построчное чтение вывода команды

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
pcodr
Сообщения: 283
ОС: Debian

Bash и построчное чтение вывода команды

Сообщение pcodr »

Недавно обнаружил, что в баше можно очень удобно получать вывод команды во время ее выполнения и производить с ним некие действия.
Например для wget работает следующая конструкция

Код: Выделить всё

wget ТУТ_ССЫЛКА 2>&1 | while read line
do
 #тут в переменной $line имеем вывод wget, можем его изменить и вывести, переход в этот блок происходит при каждом обновлении статуса wget
 echo "$line"
done


Почему аналогичная конструкция не срабатывает для curl? Переход в блок цикла не происходит при обновлении прогресс-бара

Код: Выделить всё

curl ТУТ_ССЫЛКА -o /tmp/file 2>&1 | while read line
do
 echo "$line"
done
remote system type is unix
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash и построчное чтение вывода команды

Сообщение SLEDopit »

pcodr писал(а):
14.03.2009 16:40
Почему аналогичная конструкция не срабатывает для curl?
потому что man curl
вы в файл /tmp/file сохраняете информацию, которую хотите обрабатывать.
нудо вот так:

Код: Выделить всё

curl ТУТ_ССЫЛКА -s 2>&1 | while read line
do
echo "$line"
done
зы и как у вас с вгетом все работает для меня лично остается загадкой.
вы читаете переменную line, а выводите переменную link. и все работает?:)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Bash и построчное чтение вывода команды

Сообщение pcodr »

Насчет $line/$link описался, исправил первый пост.
вы в файл /tmp/file сохраняете информацию, которую хотите обрабатывать.

Опция -o как раз говорит записывать скачиваемую информацию в файл, как известно curl по умолчанию все на консоль выводит. А считывать мне нужно не скачиваемое содержимое, а прогресс. Т.е вот это:

Код: Выделить всё

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 73 14.3M   73 10.5M    0     0   117k      0  0:02:04  0:01:32  0:00:32  115k

Опция -s вовсе отключает прогресс-бар, так что man curl невтему :)
remote system type is unix
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: Bash и построчное чтение вывода команды

Сообщение /dev/random »

curl для обновления прогресс-бара выводит не \n, а \r. read концом строки считает только '\n'. Попробуйте пропустить вывод через tr '\r' '\n'
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash и построчное чтение вывода команды

Сообщение SLEDopit »

pcodr писал(а):
14.03.2009 18:54
так что man curl невтему
ну просто про считывание прогресса оговорено не было, ну я по аналогии с wget'ом все и рассказал :)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Bash и построчное чтение вывода команды

Сообщение pcodr »

/dev/random
Спасибо, действительно curl заканчивает строку символом '\r'. Правда с помощью tr как вы предложили решить проблему не удалось, т.к видимо tr буферизирует у себя весь входной поток и дальше по каналу до своего завершения не отдает.
Но после чтения man bash было обнаружено что у read есть опция -d delim.
Итого для curl срабатывает следующая конструкция:

Код: Выделить всё

curl ТУТ_ССЫЛКА -o /tmp/file 2>&1 | while read -d $'\r' line
do
        echo "$line"
done
remote system type is unix
Спасибо сказали:
Ответить