Избегайте буферизации вывода для группы команд (фигурные скобки) в сценарии bash

У меня есть сценарий bash, содержащий группу команд в фигурных скобках { ... } . Эта группа содержит некоторые начальные команды echo а затем один цикл . На каждой итерации цикл выполняет различные медленные команды (в основном с curl и некоторый дополнительный синтаксический анализ). Каждая итерация медленная (из-за сетевого взаимодействия), но она печатает одну строку (кода python); насколько я вижу, не должно быть проблем с буферизацией, исходящих из самих команд, поскольку они прекращают работу и уходят.

Вся группа команд передается на python -u (я также пытался с tail -f проверить), и, очевидно, весь цикл выполняется до того, как все будет прочитано python -u или tail -f .

Я знаю, как отключить (по возможности) одну команду с помощью различных инструментов, таких как stdbuf но я не думаю, что это может помочь здесь, потому что похоже, что проблема возникает из командной группировки, а не из той или иной команды.

Любой намек?

2 Solutions collect form web for “Избегайте буферизации вывода для группы команд (фигурные скобки) в сценарии bash”

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

О, ради всего святого. Проблема в tail -f . Это прекрасно работает:

 #!/bin/bash printf 'hi\n' { for i in 1 2 3 4; do sleep 0.5 /bin/echo $i done; } | cat printf 'bye\n' 

Это не труба, это не группа. Это tail . Как и в России, преследуя наши собственные хвосты!

Таким образом, tail -f не удалось, потому что по какой-то причине он не выводится сразу. Не знаю, почему python -u терпит неудачу, но я не думаю, что это что-то в скрипте. Может быть, попробуйте unbuffer . Попробуйте свой сценарий с cat , по крайней мере, и убедитесь, что в этом случае он не загружен.


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

Этот скрипт демонстрирует ту же проблему буферизации, которую вы получаете:

 #!/bin/bash printf 'hi\n' { for i in 1 2 3 4; do sleep 0.5 printf '%s\n' $i done; } | tail -f printf 'bye\n' 

Этого нет. Вывод внутри группы перенаправляется на stderr, затем stderr из всей группы передается по команде в команду. Поскольку это stderr, он не загружен.

 #!/bin/bash printf 'hi\n' { for i in 1 2 3 4; do sleep 0.5 printf '%s\n' $i 1>&2 done; } |& tail -f printf 'bye\n' 

Адаптировано из ответа Ван Хунцзина в этом вопросе . Трудность заключалась в том, чтобы найти способ небуферировать трубу с помощью скобок, а не явную команду. Пришлось немного поиграть, чтобы правильно перенаправить перенаправление.

вам просто нужно сделать:

 { stdbuf -o0 curl ... stdbuf -o0 whatever ... }| tail -f 

…, который будет работать для динамически связанных приложений, хотя я уверен, что curl включает в себя собственный переключатель небуферов .

  • Bash: Цитирование через строку
  • Выполнение функции bash из командной строки
  • Отправка сценария в tty вместо vt (определенная проблема, приветствуются другие решения)
  • Вставить новую строку со значением, когда значение не найдено вообще
  • сравнить файлы по строкам и создать новое одно bash-программирование
  • Несколько входов в одной команде
  • если условие с ssh выходит во время цикла без завершения
  • Скрипт сопоставляет буквенный шаблон по нескольким строкам?
  • Есть ли заклинание командной строки для сохранения определенных столбцов по имени в CSV-файле?
  • Как создать список элементов под определенными заголовками в текстовом документе? (Linux / Bash)
  • Извлечение строк между специальными символами
  • Interesting Posts

    Записи Crontab в Linux Server автоматически удаляются автоматически

    Я не хочу, чтобы другие пользователи видели мои процессы в ps aux. У меня есть корень. Это Debian. Как использовать grsec?

    256 цветов в консоли (tty)

    avahi-daemon и «.local» вопросы домена

    Избавиться от десятичного разряда и отменить запятую

    logrotate не работает

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

    Как я могу совместно использовать внутренний диск через NFS? (Что я делаю не так?)

    Как я могу использовать подстановочные знаки с ls для поиска файлов, которые отсутствуют в числовой последовательности?

    Когда вы используете ssh на сервере, вы используете настройки сервера или свои собственные настройки?

    архивирование файлов без изменений

    Равномерно распределять ресурсы по нескольким направлениям

    linux keyboard: как переназначить ключ евро от последовательности ALT 0128 до PgUp?

    Почему «ps -p proc1 proc2 proc3» показывает «-csh», «-tcsh» и «- / bin / tcsh», тогда как «ps -p proc » индивидуально все говорят «tcsh»?

    SSH переадресация окна с Xming

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