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

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

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

答え2

名前付きコマンドはなく、別々ですtime wctimewc言葉シェルに。

今はしばしば2つの別々プログラムname time、1つはシェルキーワード、もう1つは外部コマンドです。timeシェルはシェルキーワードであり、入力すると、time wc ...シェルは外部キーワードのtime代わりにそのキーワードを使用します。時間ユーティリティ

シェルがtimeキーワードを使用する場合は必要ありません。クロス()新しいプロセスでは、現在のtime標準と標準偏差は変更されません。リダイレクトセクションは次の場所にあります。

time wc file > wc.out 2>&1

衝撃のみwc

使用するとき複合コマンド(list):

(time wc file) > wc.out 2>&1

シェルはtime wc fileサブシェル内で実行されます(time wc file)一つコマンドのリダイレクトセクションは、現在およびをtime含む標準出力と標準エラーに影響を与えますwc


異なる形式のグループ化コマンドを使用すると、新しいプロセスを作成するコストなしで同じ効果を得ることができます{list;}

{time wc file;} > wc.out 2>&1

externalを使用すると、time新しいプロセスで実行されるため、この問題は発生しません。

/usr/bin/time wc file > wc.out 2>&1

答え3

time実行中ののはbash内蔵されているからです。 Bashはこれを特別な方法で処理します。

実際のバイナリを使用すると、期待timeどおりに正しく動作します。

/usr/bin/time wc file > wc.out 2>&1

今回は出力が少し異なりますが、次のようになります。

 $ /usr/bin/time wc file > wc.out 
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata1900maxresident)k
0inputs+8outputs (0major+82minor)pagefaults 0swaps

答え4

time はシェル組み込み関数なので、次のように書き込みます。シェルコマンドの標準エラーではなく、標準エラーです。

コマンド全体をstderrをリダイレクトするサブシェルに強制するには、括弧を使用します。

中かっこを使用すると、実際にサブシェルを起動せずに同様の結果を得ることができます。

  { time who ; } > /tmp/timwho >& /tmp/xx 

(はい、セミコロンが必要です)

関連情報