Немедленно получить выходные данные оболочки bash из именованного канала - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть несколько команд, которые я запускаю между скобками, которые я затем перенаправляю на именованный канал и подключаю к каналу, однако похоже, что перенаправление происходит только после завершения выполнения блока, поскольку я не вижу никакого вывода из команды 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 Ответ

0 голосов
/ 08 ноября 2018

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

Если вы хотите снять с буфера вывод произвольной команды, вам может пригодиться утилита "unbuffer" или любое из решений, упомянутых в этом вопросе: Как сделать вывод любой команды оболочки небуферизованным?

Если вы имеете дело с конкретными приложениями, у них могут быть варианты уменьшения буферизации. Например, GNU grep включает опцию --line-buffered.

...