Я намагаюся застосувати часові позначки до 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
. Це, звичайно, не спрацює з неперевершеним, але у вас може не виникнути проблем з неперловою програмою.