Немедленно получить выходные данные оболочки 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 вариант.

Другие вопросы по тегам