web-dev-qa-db-ja.com

アンバッファが機能しているのにstdbufが機能しない

プロセスのstdoutにタイムスタンプを適用しようとしています。適切なタイムスタンプを適用するために、プロセスのunbufferstdoutを試みます。これは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は、特定の状況でエラーコードを飲み込むため、不適切です(私は投稿しました その動作に関する別の質問 )。

6
frankc

試してください 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
1
agc