GNU Coreutils разделить многословный м?

582
719016

Как использовать команду GNU coreutils splitс подробным режимом, как я могу сделать так, чтобы строки, появляющиеся в STDOUT, были сброшены относительно времени, когда файл был наконец создан?

Например, запустив его так:

~/coreutils/bin/split --verbose -d -u -l 10000000 1>out & tail -f out creating file `x00' creating file `x01' creating file `x02' [...] 

Я ожидал бы, что строка creating file 'x00'появится в файле outпосле того, как файл будет полностью записан, но вместо этого кажется, что ничего не записано, outпока весь файл не будет окончательно обработан. Есть ли способ изменить это поведение?

0
I think all GNU coreutils use output buffering, so they won't output anything until the buffer is filled or earlier if the output is an interactive terminal. MV. 11 лет назад 0
вывод в stdout буферизован, stderr - нет. lornix 11 лет назад 0

1 ответ на вопрос

1
MV.

Хорошо, старые версии GNU coreutils (до 7.5) не имеют простого обходного пути (насколько я знаю), но в более новых версиях (начиная с 7.5) есть команда stdbuf, которую можно использовать для принудительного разделения (или любой другой программы coreutil) немедленно распечатать свой вывод. В вашем случае вы можете использовать:

~/coreutils/bin/stdbuf -o0 ~/coreutils/bin/split --verbose -d -u -l 10000000 1>out & tail -f out 

Это запустит разделение с отключенной буферизацией вывода.

Обратите внимание, что опция -u (небуферизованная) в split не влияет на печать сообщения, а только на данные, которые она разделяет (если вы отключите эту буферизацию, она будет работать медленнее).

Информация о stdbuf: http://www.gnu.org/software/coreutils/manual/html_node/stdbuf-invocation.html.

В качестве альтернативы при использовании более старых версий coreutils, проверьте это решение, используя команду unbuffer из ожидаемого пакета (tcl): https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

Похожие вопросы