time
writesstderr
なので、2>&1
コマンドラインに追加すると、出力をルーティングする必要があると主張することもできますstdout
。しかし、これはうまくいきません。
test@debian:~$ cat file
one two three four
test@debian:~$ time wc file > wc.out 2>&1
real 0m0.022s
user 0m0.000s
sys 0m0.000s
test@debian:~$ cat wc.out
1 4 19 file
これは括弧を使用する場合にのみ機能します。
test@debian:~$ (time wc file) > wc.out 2>&1
test@debian:~$ cat wc.out
1 4 19 file
real 0m0.005s
user 0m0.000s
sys 0m0.000s
この場合、なぜ括弧が必要なのですか?なぜ次time wc
のように解釈されないのですか?シングル注文する?
ベストアンサー1
ksh
、 、bash
とはコマンド(組み込みかどうか)ではzsh
なく、time
などの言語の予約語です。for
while
これはパイプライン1の時間を測定するために使用されます。
存在する:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
パイプを実行するようにシェルに指示する特別な構文があります。
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
時間統計を報告します。
存在する:
time cmd > output 2> error
それは同じです、あなたも同じです。タイミングコマンドcmd > output 2> error
およびタイミング統計は、シェルの stderr にまだ表示されます。
以下を行う必要があります。
{ time cmd > output 2> error; } 2> timing-output
または:
exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-
timing-output
シェルの標準エラーを時間構成の前にリダイレクトするには(もう一度言いますが、注文する)が使用されます(ここでは時間ですcmd > output 2> error 3>&-
)。
あなたもtime
できますサブシェル標準エラーがリダイレクトされます。
(time cmd > output 2> error) 2> timing-output
time
ただし、ここではこのサブシェルは必要ありません。この設定を呼び出すときにstderrをリダイレクトするだけです。
ほとんどのシステムにはコマンドもありますtime
。このキーワードを無効にして呼び出すことができますtime
。キーワードは文字通り受け入れたときにのみ認識されるので、何らかの方法でキーワードを参照するだけです。
'time' cmd > output 2> error-and-timing-output
ただし、形式が異なる場合があり、両方の形式のstderrtime
が 。cmd
error-and-timing-output
またtime
、構成とは異なり、コマンドはtime
タイムパイプ、複合コマンド、関数、またはシェル組み込み機能を使用できません。
組み込みコマンドの場合、関数呼び出しまたは組み込みコマンドの時間を測定できますが、リダイレクト、パイプ、または複合コマンドは測定できません。
1参考bash
(考えられる)エラーがありますここでtime (cmd) 2> file
(たとえばではないtime cmd | (cmd2) 2> file
)タイミング出力を次にリダイレクトします。file