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