5

Я пытаюсь применить временные метки на стандартный вывод процесса. Для надлежащих временных меток , которые будут применяться, я пытаюсь 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 не подходит, потому что он глотает коды ошибок при определенных обстоятельствах (я написал отдельный вопрос об этом поведении).

1 ответ1

1

Попробуйте annotate-output. Он предоставляет временные метки для STDIN, STDOUT и STDERR.

Например, используйте wc для подсчета строк подстановки процесса bash (одна строка) и несуществующего файла:

annotate-output wc -l <(echo foo) nosuchfile

Выход:

10:17:45 I: Started wc -l /dev/fd/63 nosuchfile
10:17:45 O:       1 /dev/fd/63
10:17:45 E: wc: nosuchfile: No such file or directory
10:17:45 O:       1 total
10:17:45 I: Finished with exitcode 1

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