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
_メッセージ。
あなたが私に何を求めているのか私が理解していれば、これで十分です。私は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
そして、これがtee
によって作成されたcmd.log
ファイルの内容です。
$ more cmd.log
cmd.log
file1
file2
file3
file4
file5
real 0m0.005s
user 0m0.000s
sys 0m0.001s
time
は、デフォルトでstdoutではなくstderrに出力を送信します。必要な場所にリダイレクトするだけです。
あなたは"一方、time
fooを行い、time
の出力をリダイレクトしたい場合は、time (./foo) | bar
。"と言います。 =しかし、これは実際には正しくありません。この場合、時間の出力は引き続きコンソールに表示され、stdoutのみがリダイレクトされます。
Stderrは具体的に次のようにリダイレクトできます。
(time foo) 2>&1 | bar
または次のすべてのパイプ:
(time foo) |& bar
ブラケットは、これが正しく機能するために必要です。
これはSolarisで動作することがわかりました。 (time ls) &> file