Timeコマンドの出力をリダイレクトしようとしましたが、できませんでした:
$time ls > filename
real 0m0.000s
user 0m0.000s
sys 0m0.000s
ファイルでは、ls
の出力ではなく、time
コマンドの出力を見ることができます。私ができなかった理由とその方法を説明してください。
次を使用して時間出力をリダイレクトできます。
(time ls) &> file
中括弧を使用できるように、単一のコマンドとして(時間ls)を取る必要があるためです。
サブシェルを起動する必要はありません。コードブロックを使用することもできます。
{ time ls; } 2> out.txt
または
{ time ls > /dev/null 2>&1 ; } 2> out.txt
コマンド時刻は、その出力を(STDOUTではなく)STDERRに送信します。これは、通常実行されるコマンド(この場合はls)がSTDOUTに出力するためです。
時間の出力をキャプチャする場合は、次のように入力します。
(time ls) 2> filename
これは時間の出力のみをキャプチャしますが、lsの出力はコンソールに対して正常になります。 1つのファイルに両方をキャプチャする場合は、次のように入力します。
(time ls) &> filename
2> STDERRをリダイレクトし、&>両方をリダイレクトします。
時間はシェルに組み込まれており、リダイレクトする方法があるかどうかはわかりません。ただし、/usr/bin/time
代わりに、出力リダイレクトを確実に受け入れます。
time
からの出力とコマンドを混在させたくない場合。 GNU timeの場合、-o file
のような:
/usr/bin/time -o tim grep -e k /tmp 1>out 2>err
tim
は時間の出力であり、out
とerr
はgrep
のstdoutとstderrです。
リダイレクトがtime
で機能しないように見える理由は、パイプラインの前で使用される場合、bash予約語(組み込みではない!)であるためです。 bash(1):
時間予約されたWordがパイプラインの前にある場合、パイプラインが終了すると、その実行によって消費された経過時間とユーザー時間およびシステム時間が報告されます。
したがって、time
の出力をリダイレクトするには、中括弧を使用します。
{ time ls; } 2> filename
または/usr/bin/time
を呼び出します:
/usr/bin/time ls 2> filename