Я намагаюся застосувати часові позначки до stdout процесу. Для належних застосованих часових позначок я намагаюся unbuffer промальовувати процес. Це працює з, unbufferале не з тим, stdbufяк я б очікував. Розглянемо наступний сценарій повільного друку ' slowprint ':
#!/bin/bash
if [ $# -ne 2 ]; then
echo "usage: ${0%%/*} <file> <delay in microseconds>"
exit 1
fi
DELAY=$2 perl -pe 'BEGIN{use Time::HiRes qw(usleep)} { usleep($ENV{DELAY}) }' $
тепер порівняйте наступні спроби застосування часових позначок:
stdbuf -oL ./slowprint <(ls) 100000 |
awk '{ print strftime("%H:%M:%S"), $0; fflush(); }'
проти
unbuffer ./slowprint <(ls) 100000 |
awk '{ print strftime("%H:%M:%S"), $0; fflush(); }'
Другий працює для мене, тоді як перший - ні, хоча я очікую, що вони зроблять те саме. Наразі unbufferвін непридатний, оскільки він ковтає коди помилок за певних обставин (я розмістив окреме запитання щодо такої поведінки ).
perlдозволяє сценаріям робити досить низький рівень вводу / виводу, і я думаю (але я не впевнений), що впливає на буферизацію. Тут ви можете змінити це значення, встановивши$|=1або з ефектом "англійська"$OUTPUT_AUTOFLUSH=1. Це, звичайно, не спрацює з неперевершеним, але у вас може не виникнути проблем з неперловою програмою.