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
答え2
名前付きコマンドはなく、別々ですtime wc
。time
wc
言葉シェルに。
今はしばしば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
(はい、セミコロンが必要です)