Команды обычно не буферизуют свой ввод. Они сделали бы read()
для большого чанка, но при чтении из канала, если в конвейере не так много байтов, read()
системный вызов вернет столько символов, сколько есть, и приложение, как правило, будет работать с этим, если сможет ,
Заметным исключением является то, mawk
что будет продолжаться read()
до тех пор, пока входной буфер не будет заполнен.
Приложения действительно буферизируют свои выходные данные (stdout). Обычное поведение состоит в том, что если вывод идет в tty, то буферизация будет построчной (то есть, она не начнет записывать в стандартный вывод, пока не получит полную строку для вывода, или заполненную блоком для очень длинная строка), в то время как для любого другого типа файла буферизация выполняется по блокам (то есть запись не начнется, пока не будет заполнен один блок для записи (что-то вроде 4 КБ / 8 КБ ... зависит от программного обеспечения и системы). )).
Таким образом, в вашем случае, LongRunningCommand
вероятно, буферизует его вывод блоками (так как его вывод является конвейером, а не tty), и, tr
скорее всего, буферизует его вывод построчно, поскольку его выход, вероятно, является терминалом.
Но, так как вы удаляете каждый символ новой строки из его вывода, он никогда не будет выводить строку, поэтому буферизация будет выполняться по блокам.
Так что здесь вы хотите отключить буферизацию для обоих LongRunningCommand
и tr
. В системах GNU или FreeBSD:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
Обратите внимание, что если вы хотите соединить строки запятыми, лучше использовать этот подход paste -sd , -
. Таким образом, вывод будет завершен символом новой строки (вам, вероятно, все равно потребуется отключить буферизацию).
stdbuf
к LongRunningCommand или к tr, или к обоим по-разному?