gnu coreutils разделить многословную?

0

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

    
задан 719016 02.07.2012 в 16:42
источник

1 ответ

1

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

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

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

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

Информация о stdbuf: Ссылка

Для альтернативы при использовании старых версий coreutils проверьте это решение, используя команду unbuffer из пакета expect (tcl): Ссылка

    
ответ дан MV. 02.07.2012 в 17:17
источник