web-dev-qa-db-ja.com

「time」コマンドの出力をリダイレクトするにはどうすればよいですか?

Timeコマンドの出力をリダイレクトしようとしましたが、できませんでした:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

ファイルでは、lsの出力ではなく、timeコマンドの出力を見ることができます。私ができなかった理由とその方法を説明してください。

88
abubacker

次を使用して時間出力をリダイレクトできます。

(time ls) &> file

中括弧を使用できるように、単一のコマンドとして(時間ls)を取る必要があるためです。

97
sganesh

サブシェルを起動する必要はありません。コードブロックを使用することもできます。

{ time ls; } 2> out.txt

または

{ time ls > /dev/null 2>&1 ; } 2> out.txt
119
ghostdog74

コマンド時刻は、その出力を(STDOUTではなく)STDERRに送信します。これは、通常実行されるコマンド(この場合はls)がSTDOUTに出力するためです。

時間の出力をキャプチャする場合は、次のように入力します。

(time ls) 2> filename

これは時間の出力のみをキャプチャしますが、lsの出力はコンソールに対して正常になります。 1つのファイルに両方をキャプチャする場合は、次のように入力します。

(time ls) &> filename

2> STDERRをリダイレクトし、&>両方をリダイレクトします。

22
Mnementh

時間はシェルに組み込まれており、リダイレクトする方法があるかどうかはわかりません。ただし、/usr/bin/time代わりに、出力リダイレクトを確実に受け入れます。

9
Michal Čihař

timeからの出力とコマンドを混在させたくない場合。 GNU timeの場合、-o fileのような:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

timは時間の出力であり、outerrgrepのstdoutとstderrです。

3
Ding-Yi Chen

リダイレクトがtimeで機能しないように見える理由は、パイプラインの前で使用される場合、bash予約語(組み込みではない!)であるためです。 bash(1):

時間予約されたWordがパイプラインの前にある場合、パイプラインが終了すると、その実行によって消費された経過時間とユーザー時間およびシステム時間が報告されます。

したがって、timeの出力をリダイレクトするには、中括弧を使用します。

{ time ls; } 2> filename

または/usr/bin/timeを呼び出します:

/usr/bin/time ls 2> filename
2
user1338062