У меня есть (собственная) программа, с которой я запускаю ./program -a asdf
в Терминале. Когда я делаю это, я вижу весь вывод в нужное время.
Однако, когда я хочу использовать вывод программ в моем сценарии и работать ./program -a asdf | script.sh
, с "script.sh", просто содержащим read line
и echo $line
в цикле вывод программы является "странным". Когда программа печатает первый блок строк, сценарий ничего не печатает. Когда программа (несколько минут спустя) распечатает 2-й блок строк, мой сценарий распечатает первый блок.
Почему?
Существует ли путь к моему собственному сценарию для "действия как терминал" для получения вывода, как только он обнаружился бы в терминале?
Проблема состоит в том, что ./program -a asdf
вывод буферизуется, когда выполнено в конвейере, и что любой вывод, это собирается находиться в буфере, пока этот не становится сытым.
можно управлять выходной буферизацией команды с помощью stdbuf
; в частности, для выполнения ./program -a asdf
с освободившим буфер stdout
:
stdbuf -o0 ./program -a asdf
Так, чтобы Ваш буферизированный конвейер стал:
stdbuf -o0 ./program -a asdf | script.sh