Как использовать команду 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 весь файл не был окончательно обработан. Есть ли способ изменить это поведение?

1 ответ1

1

Хорошо, старые версии 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .