Немедленно получить выходные данные оболочки bash из именованного канала
У меня есть несколько команд, которые я запускаю между скобками, которые я затем перенаправляю на именованный канал и подключаю к каналу, однако похоже, что перенаправление происходит только после завершения выполнения блока, так как я некоторое время не вижу вывода из команды tail и он показывает только последний вывод команды, когда я делаю. Любые идеи, как просмотреть вывод блока в режиме реального времени?
Пример скрипта
#!/usr/bin/env bash
mkfifo /tmp/why_you_no_out;
trap "rm /tmp/why_you_no_out" 0;
{
for ((i=1;i<=100;i++)); do
printf "$i";
done
sleep 10s;
printf "\n12356";
} >> /tmp/why_you_no_out &
printf "here";
tail -n 1 -f /tmp/why_you_no_out
1 ответ
Похоже, проблема в буферизации. Большинство оболочек не хотят записывать данные по байту за раз, потому что это расточительно. Вместо этого они ждут, пока у них будет значительный кусок данных, прежде чем их фиксировать, если выход не подключен к вашему терминалу.
Если вы хотите снять с буферизации выходные данные произвольной команды, вам может пригодиться утилита "unbuffer" или любое из решений, упомянутых в этом вопросе: Как сделать вывод любой команды оболочки небуферизованным?
Если вы имеете дело с конкретными приложениями, у них могут быть варианты уменьшения буферизации. Например, GNU grep включает в себя --line-buffered
вариант.