web-dev-qa-db-ja.com

「時間」出力とコマンド出力を同じパイプにリダイレクトするにはどうすればよいですか?

fooというバイナリがあるとします。

fooの出力を他のプロセスbarにリダイレクトする場合は、_./foo | bar_と記述します。

一方、time fooを使用してtimeの出力をリダイレクトしたい場合は、time (./foo) | barと記述します。

私の質問は、timeの出力をfooの出力の最後に固定して、同じパイプ

次の解決策はnotです。これは、プロセスの2つの個別のインスタンスbarを開始しますが、単一の共有パイプが必要なため、bar

_time (./foo | bar)  | bar
_

好奇心が強い人にとって、barの2つのインスタンスを開始したくない理由は、barがネットワーククライアントになる可能性があり、タイミング情報をサーバーの一部としてサーバーに送信するためです。プロセス出力と同じ_http POST_メッセージ。

25
merlin2011

あなたが私に何を求めているのか私が理解していれば、これで十分です。私はls ~teeの代用としてコマンド./foobarを使用していますが、必要な一般的な形式は次のとおりです。

$ ( time ./foo ) |& bar

注:timeの出力は、./fooからの出力の最後にすでにアタッチされています。これは、STDERRで行われているだけです。パイプを介してリダイレクトするには、STDERRとSTDOUTを組み合わせる必要があります。そのためには、|&または2>&1を使用できます。

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

そして、これがteeによって作成されたcmd.logファイルの内容です。

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s
31
slm

timeは、デフォルトでstdoutではなくstderrに出力を送信します。必要な場所にリダイレクトするだけです。

あなたは"一方、time fooを行い、timeの出力をリダイレクトしたい場合は、time (./foo) | bar。"と言います。 =しかし、これは実際には正しくありません。この場合、時間の出力は引き続きコンソールに表示され、stdoutのみがリダイレクトされます。

Stderrは具体的に次のようにリダイレクトできます。

(time foo) 2>&1 | bar

または次のすべてのパイプ:

(time foo) |& bar

ブラケットは、これが正しく機能するために必要です。

10
Riot

これはSolarisで動作することがわかりました。 (time ls) &> file

0
anisbet