16

このコマンドの実行にかかった時間を txt ファイルに書き込む必要があります。

time ./program.exe

どうすればbashスクリプトでできますか?

試してみまし>> time.txtたが、うまくいきません(出力はファイルに送られず、画面に送られます)。

4

4 に答える 4

24

ファイルtimebash書き込むのは大変な作業です。bash組み込みコマンドです。(Mac OS X には、同様の機能を実行する外部コマンド があり/usr/bin/timeますが、出力形式が異なり、抵抗が少なくなります。)

以下を使用する必要があります。

(time ./program.exe) 2> time.txt

標準エラーに書き込みます(したがって、2>表記法)。ただし、サブシェル (括弧) を使用しないと機能しません。出力は引き続き画面に表示されます。


または、サブシェルなしで、次を使用できます。

{ time ./program.exe; } 2> time.txt

左中括弧とセミコロンの後のスペースに注意してください。両方とも 1 行で必要です。中かっこは、コマンドが表示される可能性のある場所に表示する必要があり、スタンドアロンのシンボルである必要があります。...;}|something(十分に苦労すれば、 orを思いつくでしょう...;}2>&1。ただし、これらは両方ともブレースをスタンドアロンのシンボルとして識別します。ただし、 を試みる...;}xyzと、シェルは (おそらく) というコマンドを見つけられません}xyz。)


more ターミナルで more コマンドを実行する必要があります。私がこれを行う場合:

 xterm -xrm '*hold: true' -e (time ./Program.exe) >> time.exe & sleep 2

それは機能せず、教えてくれSyntax error: "(" unexpectedます。これを修正するにはどうすればよいですか?

次のようなことをする必要があります:

xterm -xrm '*hold: true' -e sh -c "(time ./Program.exe) 2> time.txt & sleep 2"

重要な変更点は、引数から-cオプションへのスクリプトを使用してシェルを実行することです。または同等の名前shに置き換えることができます。/bin/bashこれにより、「構文エラー」の問題を回避できます。ただし、何がそのエラーを引き起こすのかよくわからないので、より簡単でより良い対処方法があるかもしれません. xtermのオプションが単一の文字列引数しかとらないことも考えられ-eます。その場合、次を使用すると思います。

xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"'

xterm私と同じように手動でバッシュできます。

時間指定プログラムをバックグラウンド モードで実行する理由はわかりませんが、それはあなたの問題であって、私の問題ではありません。同様に、がターミナルを開いたままにsleep 2しておく場合は、明らかに必要ありません。hold: true

于 2012-11-01T12:03:45.260 に答える
0

time_elapsed = (time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}' echo time_elapsed> file.txtこのコマンドは、目的のファイルのbashで消費された正確な時間を提供する必要があります。

別の返信で説明されているように、これを2>file.txtを使用してファイルにリダイレクトすることもできます。

于 2012-11-13T07:49:27.013 に答える
0

bash builtin の出力をリダイレクトするのは簡単ではありませんtime

1 つの解決策は、外部timeプログラムを使用することです。

/bin/time --append -o time.txt ./program.exe

(ほとんどのシステムでは GNU プログラムなので、ドキュメントを入手するのinfo timeではなく使用してください)。man

于 2012-11-01T12:06:12.907 に答える
0

コマンドを time で囲むだけ{ .. }です。

{ time ./program.exe; } 2>&1

もちろん、ビルトイン time の出力は stderr に送られるため、リダイレクトが必要です2>&1

次に、出力をキャプチャするのが難しいように見えるかもしれません{ .. }。コマンドをより簡単に読み取るために 2 秒を使用してみましょう。これは機能します。

{ { time ./program.exe; } 2>&1; } >> time.txt              # This works.

ただし、正しい構成では、次のようにキャプチャを逆にする必要があります。

{ time ./program.exe; } >> time.txt  2>&1;                 # Correct.

コマンドからの出力を閉じるには、次のように出力を /dev/null にリダイレクトします。

{ time ./program.exe >/dev/null 2>&1; } >> time.txt 2>&1   # Better.

そして、stderr には出力しかないため、単純にキャプチャすることができます。

{ time ./program.exe >/dev/null 2>&1; } 2>> time.txt       # Best.

./program からの出力はリダイレクトする必要があります。そうしないと、time.txt 内で終了する可能性があります。

于 2015-10-01T05:34:28.963 に答える