240

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を使用した他の時間の実装があることは知っていますが、私の質問はそれらのオプションを使用しないコマンドについてです。

助言がありますか ?

4

12 に答える 12

322

試す

{ time sleep 1 ; } 2> time.txt

これは、「時間」のSTDERRとコマンドをtime.txtに結合します。

または使用する

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

これにより、「sleep」からのSTDERRがファイル「sleep.stderr」に入れられ、「time」からのSTDERRのみが「time.txt」に入れられます。

于 2012-11-13T06:56:53.217 に答える
58

単純。GNUtimeユーティリティにはそのためのオプションがあります。

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

/usr/bin/time -o time.txt sleep 1
于 2015-10-16T00:08:29.820 に答える
45

かっこtimeで囲み、タイミングを合わせているコマンドを囲みます。

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

$ (time ls) > outfile 2>&1

または、コマンドの出力をキャプチャされた出力から分離したい場合time

$ (time ls) > ls_results 2> time_results
于 2012-11-13T06:55:55.217 に答える
17

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

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

また

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

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

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

そうは言っても、GNU時間を使用できるのであれば、@TimLudwinskiが言ったことを実行してください。

\time -o time.log command
于 2015-04-06T00:08:50.330 に答える
10

'time'コマンドの出力はエラー出力であるため、標準出力の方がより直感的に処理できるため、リダイレクトしてください。

{ time sleep 1; } 2>&1 |  cat > time.txt
于 2016-07-06T18:35:28.407 に答える
6

組み込みのbashの代わりにGNU時間を使用している場合は、

time -o outfile command

(注:GNUの時間形式はbash組み込みとは少し異なります)。

于 2013-10-03T20:36:47.097 に答える
4

私は最終的に以下を使用しました:

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

あなたの場合

&>out time sleep 1 >/dev/null

それから

cat out
于 2012-11-13T06:59:07.857 に答える
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に復元されます。

于 2016-01-21T18:03:00.767 に答える
2

元のプロセスの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

これをラッパー(例:cronjobs)に使用して、ランタイムを監視できます。

#!/bin/bash

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

{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log
于 2017-08-15T14:21:04.453 に答える
0

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

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

例えば:

/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
于 2018-05-17T15:16:16.673 に答える
0

シェル変数の時間だけが必要な場合は、次のように機能します。

var=`{ time <command> ; } 2>&1 1>/dev/null`
于 2021-01-19T18:46:18.323 に答える