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


24

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

出力をリダイレクトしたい場合 foo他のプロセスbar、次のように記述できます./foo | bar

一方、私がしたい場合 time FOO、およびリダイレクトの出力timeIは、書くことができますtime (./foo) | bar

私の質問は、どのように出力を出力のtime最後に貼り付けることができますかfoo同じパイプにパイプする方法はありますか?

次の解決策は私が探しているものではありません。プロセスの2つの別々のインスタンスを開始するのbarに対し、1つの共有パイプを1つのインスタンスにbar

time (./foo | bar)  | bar

好奇心旺盛で、誰のために、2つのインスタンスを開始したくない理由barISがあるためbar、ネットワーククライアントにすることができ、私はタイミング情報が同じの一部としてサーバーに送信したいhttp POSTプロセス出力としてメッセージ。


:、ここでやや良い答え答えstackoverflow.com/questions/13356628/...
JDS

回答:


29

あなたが私に求めていることを理解していれば、これでうまくいきます。私は、コマンド使用していますls ~teeのためなどのスタンドインを./fooしてbar、しかし、あなたが何をしたいの一般的な形式は以下です:

$ ( 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

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

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

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

この構文はBASHでは機能しないことに注意してください。
jvriesem

1
@jvriesemすべての例はbash
slm

9

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

あなたは言う、「私がしたかった場合、一方timeのfoo、との出力リダイレクトtime私は、書くことができますtime (./foo) | bar。」しかし、これは実際には間違っています。この場合、時間の出力は引き続きコンソールに表示され、stdoutのみがリダイレクトされます。

以下を使用して、stderrを具体的にリダイレクトできます。

(time foo) 2>&1 | bar

または以下のすべてのパイプ:

(time foo) |& bar

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


0

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


1
これは、既存のソリューションのいずれとも違いはありません
-roaima
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.