プロセスのstdoutにタイムスタンプを適用しようとしています。適切なタイムスタンプを適用するために、プロセスのunbuffer
stdoutを試みます。これは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(); }'
vs
unbuffer ./slowprint <(ls) 100000 |
awk '{ print strftime("%H:%M:%S"), $0; fflush(); }'
2つ目は機能しますが、1つ目は機能しませんが、同じことを期待しています。現在、unbuffer
は、特定の状況でエラーコードを飲み込むため、不適切です(私は投稿しました その動作に関する別の質問 )。
試してください annotate-output
。 [〜#〜] stdin [〜#〜]、[〜#〜] stdout [のタイムスタンプを提供します〜#〜]、および[〜#〜] stderr [〜#〜]。
例として、wc
を使用して、bash
プロセス置換、(1行)、およびの行数をカウントします。存在しないファイル:
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