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


95

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

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

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


1
スーパーユーザーになるべきだと思います。
Mnementh

1
この質問への答えだけでなく、他のパワーユーザーのためのプログラマのための関心の:superuser.com
Mnementh

回答:


104

あなたはを使用して時間出力をリダイレクトすることができます、

(time ls) &> file

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


1
ええ、かなり大丈夫ですが、問題は彼らがこれをどのようにしたのですか?
アブバッカー

2
timeコマンドは、引数をコマンドとして受け取ります。ただし、括弧はそれを1つのコマンドとしてグループ化します。例:時間ls> file1.txt引数では、0 =時間1 = "ls> file1.txt"
sganesh

8
また、timeコマンドは出力をstderrに出力します。したがって、(time ls)2>ファイルを使用できます
sganesh

5
明確化&>私はこれらについて学ぶことができますしてください、?
hello_there_andy 2017

3
@hello_there_andy &>fileはに類似してい>file 2>&1ます。stdoutとstderrの両方を指示します。
ktbiz 2017

129

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

{ time ls; } 2> out.txt

または

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

1
同意し、ベストアンサー。ls結果を破棄し、時間を取得するオプションを提供します。ありがとうghostdog74
rd42

1
「hostent」コマンドの出力をリダイレクトできないものがあった場合、これはAIXで機能しました。ありがとうございました!
Hugo

1
明確化して2>ください。これらについてどこで知ることができますか?
hello_there_andy 2017

3
>と2>の両方が同時に必要な場合はどうすればよいですか?
ホルヘフェルナンデス

25

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

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

(time ls) 2> filename

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

(time ls) &> filename

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


1
この答えは、OPのリダイレクトが機能しなかった理由を実際に答えます。これは、OPが尋ねていた質問の1つでした。他の誰もこれに対処しません。
NeutronStar 2016年

これでどのように1つのパイプを別のプロセスに送るのですか?
ポール

10

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


/ usr / bin / time --output filename ls
chub

4
組み込みの時刻は、出力リダイレクトでうまく機能します。STDOUTではなく、STDERRでのみ出力します。
Mnementh

問題は、組み込みコマンドがサブシェルではなくシェル環境自体で実行されることです。シェルのstderrは通常端末に接続されているため、リダイレクトは何もしません。組み込みの時間をリダイレクトするには、のようにする必要があると思いbash time mycmd 2>fileます。または、/usr/bin/time言及されたように電話するだけです。
ktbiz 2017

あなたはまた、非内蔵のフルパスを指定せずに使用することができます。stackoverflow.com/questions/29540540/...
チロSantilli郝海东冠状病六四事件法轮功

4

からの出力timeとコマンドを混在させたくない場合。GNU timeでは、次の-o fileように使用できます。

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

一方では、tim時間の出力であり、outそしてerrからのstdoutとstderrですgrep


4

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

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

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

{ time ls; } 2> filename

または電話する/usr/bin/time

/usr/bin/time ls 2> filename

0

テストでは、中括弧を付けたstdoutおよびstderrメソッドのリダイレクトを使用します。
はこれを&>>rpt表しています>>rpt 2>&1が、短くなっています。
中括弧は、現在のシェルでコマンドを実行します。参照:man bash

{ time ls a*; } &>>rpt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.