Сценарий оболочки перенаправляет вывод с выводами буфера команд в некоторых случаях, а не в других - PullRequest
1 голос
/ 09 июня 2011

Я упростил сценарий оболочки до двух команд:

Терминал A (Перенаправить STDIN на именованный канал):

tee -a >>pipe

Клемма B (считано из трубы, использованной выше):

tail -f pipe

Результаты, которые я не понимаю:

  • Результат 1 : Начать тройник, запустить хвост : любой вход в первый терминал будет буферизован и появится только во втором после остановки команды тройника (ctrl-c).
  • Результат 2: Начать тройку, запустить хвост, остановить тройник, начать ее снова : теперь буферизуется только каждая строка (желаемый результат).Результаты отображаются в клемме 2 в конце каждой строки ввода в клемму 1.
  • Результат 3 (для чего это стоит): Сначала начните хвост, затем тройник : тот же результат, что и # 1.

Я также написал аналогичный скрипт, используя команды exec и cat, и он демонстрирует то же поведение.

1 Ответ

0 голосов
/ 10 июня 2011

Я не эксперт в этом, но поведение кажется простым.

Предположим, вы применяете tail к обычному текстовому файлу; он напечатает последние 10 строк и выйдет. Если вы используете tail -f, он напечатает последние 10 строк, а затем проследит за файлом; с этого момента он будет печатать каждую новую строку, добавленную к файлу. Это линия буферизации, которую вы ищете.

Теперь примените tail -f к именованному каналу. Все, что вы вставляете в другой конец, похоже на исходное содержимое файла, и tail терпеливо ждет конца, чтобы он мог напечатать «последние» 10 строк. Когда этот процесс заканчивается, он отправляет символ «конец файла» (я не знаю, что это такое, только то, что он существует) через канал, и tail печатает - и начинает мониторинг. Если затем вы запустите один или несколько новых процессов, которые записывают в канал, tail принимает новые строки как, ну, в общем, новые и выводит их на печать.

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

tail -n +1 -f pipe
...