「時間」の出力をファイルに書き込むのに角かっこが必要なのはなぜですか?

「時間」の出力をファイルに書き込むのに角かっこが必要なのはなぜですか?

timewritesstderrなので、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などの言語の予約語です。forwhile

これはパイプライン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が 。cmderror-and-timing-output

またtime、構成とは異なり、コマンドはtimeタイムパイプ、複合コマンド、関数、またはシェル組み込み機能を使用できません。

組み込みコマンドの場合、関数呼び出しまたは組み込みコマンドの時間を測定できますが、リダイレクト、パイプ、または複合コマンドは測定できません。


1参考bash(考えられる)エラーがありますここでtime (cmd) 2> file(たとえばではないtime cmd | (cmd2) 2> file)タイミング出力を次にリダイレクトします。file

おすすめ記事