Linuxでtimeコマンドの出力をファイルにリダイレクトする方法は?


202

Linuxでのプログラムのタイミングに関するちょっとした質問:timeコマンドは、プログラムの実行時間を測定することができます:

[ed@lbox200 ~]$ time sleep 1

real    0m1.004s
user    0m0.000s
sys     0m0.004s

うまくいきます。しかし、出力をファイルにリダイレクトしようとすると失敗します。

[ed@lbox200 ~]$ time sleep 1 > time.txt

real    0m1.004s
user    0m0.001s
sys     0m0.004s

[ed@lbox200 ~]$ cat time.txt 
[ed@lbox200 ~]$ 

ファイルを書き込むオプション-oを使用した時間の実装が他にもあることは知っていますが、私の質問はそれらのオプションなしのコマンドについてです。

助言がありますか ?


3
bashスクリプトがファイルに実行時間を書き込む可能性のある複製であり、これが最初のそのような質問であると私は確信していません。
ジョナサンレフラー

回答:


266

試す

{ time sleep 1 ; } 2> time.txt

「time」のSTDERRとコマンドをtime.txtに結合します

または使用

{ time sleep 1 2> sleep.stderr ; } 2> time.txt

これは、STDERRを「sleep」からファイル「sleep.stderr」に入れ、「time」からのSTDERRだけが「time.txt」に入ります


2
ありがとう、それは私の質問に正確に答えます。私が正しく理解していれば、timeコマンドの結果はstderrから取得できますか?
ed82、2012年

7
はい。ただし、中かっこで囲む必要があります。そうしないと、リダイレクトがtime評価されるコマンドの一部になります。

5
@Daniel常に内部コマンド出力を個別にリダイレクトできます(つまり、{time sleep 1 2> sleepStdErr.txt;} 2> time.txt)。これにより、時間出力のみが取得されます。それ以外の方法で個別に取得する方法があるかどうかはわかりません。
gms7777 2014年

10
stdoutから読み取るgrepのようなもので時間を使いたい場合は、を試してください{ time sleep 1; } 2>&1 | grep real。これにより、stderrがstdoutに送信され、grepで読み取ることができます。
clayzermk1

9
「;」を忘れないでください '}'を閉じる前の文字、それなしでは機能しません(私はそうしました、そして...なぜ機能しないのか不思議:))
THESorcerer

38

ラップtimeとあなたが一組のブラケットにタイミングされているコマンド。

たとえば、次の時間lsとの結果lsとタイミングの結果をに書き込みますoutfile

$ (time ls) > outfile 2>&1

または、コマンドの出力とキャプチャされた出力をtime次のように分離したい場合:

$ (time ls) > ls_results 2> time_results

12
ここにサブシェルを導入する必要はありません。
1

1
@ sampson-chenこれは、lsがstderrに何も書き込まないためにのみ機能しますか?コマンドがstdoutとstderrの両方に書き込む場合、実行するコマンドの出力と「時間」の出力をどのように「分離」しますか?
David Doria 14

36

シンプル。GNU timeユーティリティにはそのためのオプションがあります。

ただし、シェルの組み込みコマンドを使用していないことを確認する必要があります。time少なくとも、bash組み込みコマンドはそのオプションを提供していません。そのため、timeユーティリティの完全なパスを指定する必要があります。

/usr/bin/time -o time.txt sleep 1

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

14

コマンドのエラー出力を気にする場合は、組み込みのtimeコマンドを使用しながら、このように分離できます。

{ time your_command 2> command.err ; } 2> time.log

または

{ time your_command 2>1 ; } 2> time.log

ご覧のとおり、コマンドのエラーはファイルに送られます(stderrがに使用されているためtime)。

残念ながら、それを別のハンドル(など3>&2)に送信することはできません。{...}

とはいえ、GNU時間を使用できる場合は、@ Tim Ludwinskiが言ったことを実行してください。

\time -o time.log command

8

'time'コマンドの出力はエラー出力であるため、標準出力としてリダイレクトすると、さらに処理を行うことができます。

{ time sleep 1; } 2>&1 |  cat > time.txt

6

組み込みのbashではなくGNU時間を使用している場合は、

time -o outfile command

(注:GNU時間のフォーマットは、組み込みのbashとは少し異なります)。


1
これ、ありがとう。また\time -o outfile command、組み込みの代わりにGNUを使用するために( ``で)使用できます
マーク

3
&>out time command >/dev/null

あなたの場合

&>out time sleep 1 >/dev/null

その後

cat out

3
エレガントなアイデアですが、組み込みコマンドを使用しないシェルにつながります。実際のtimeバイナリがインストールされていない場合outは、のようなものが含まれますbash: time: command not found
SCY

また、GNU時間の形式は組み込みのbashと同じではないため、自動解析で問題が発生します。
Guss

3

私は結局使用しました:

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
  • 「a」は追加されます
  • 「o」は、追加するファイル名が前に付いています。
  • ここで、「f」は、printfに似た構文のフォーマットです。
  • 「%E」は0:00:00を生成します。時間:分:秒
  • / usr / bin / timeを呼び出さなければなりませんでした。bashの "time"がそれを踏みにじっていて、同じオプションがないためです。
  • OPと同じものではなく、ファイルに出力を取得しようとしました

2
#!/bin/bash

set -e

_onexit() {
    [[ $TMPD ]] && rm -rf "$TMPD"
}

TMPD="$(mktemp -d)"
trap _onexit EXIT

_time_2() {
    "$@" 2>&3
}

_time_1() {
    time _time_2 "$@"
}

_time() {
    declare time_label="$1"
    shift
    exec 3>&2
    _time_1 "$@" 2>"$TMPD/timing.$time_label"
    echo "time[$time_label]"
    cat "$TMPD/timing.$time_label"
}

_time a _do_something
_time b _do_another_thing
_time c _finish_up

これには、サブシェルを生成しないという利点があり、最終的なパイプラインでは、そのstderrが実際のstderrに復元されます。


0

元のプロセスのstdoutとstderrを変更したくない場合は、stderrをファイル記述子3にリダイレクトして戻すことができます。

$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out

real    0m0.009s
user    0m0.004s
sys     0m0.000s

これをラッパー(cronジョブなど)に使用して、ランタイムを監視できます。

#!/bin/bash

echo "[$(date)]" "$@" >> /my/runtime.log

{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log

0

使用している場合は、以下を使用cshできます。

/usr/bin/time --output=outfile -p $SHELL  -c 'your command'

例えば:

/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.