2017-09-11 18 views
1

私はスクリプトで複数回プログラムを実行していますが、実行するたびに実行時間を取得する必要があります。私はターミナル経由で使用するときと同じように "time"関数を使用しようとしていますが、実際には機能しません。ここでは、スクリプト内の「時間」機能と私のコードは次のとおりです。シェルスクリプトの各「サブプロセス」の実行時間を測定する方法

#!/bin/sh 
time ./tree <in_1.in> out_1.out 
time ./tree <in_2.in> out_2.out 
time ./tree <in_3.in> out_3.out 
time ./tree <in_4.in> out_4.out 
time ./tree <in_5.in> out_5.out 
time ./tree <in_6.in> out_6.out 
time ./tree <in_7.in> out_7.out 
time ./tree <in_8.in> out_8.out 
time ./tree <in_9.in> out_9.out 
time ./tree <in_10.in> out_10.out 

注1:各ラインの前に「時間」がなければ、スクリプトが完全に実行されます。可能であれば、すべての録音時間を新しいファイルに入れたいですが、 "エコー"を試してみましたが、何の不運もありませんでした。

注2:スクリプトをディレクトリ内のすべてのファイルで実行する方法はありますか?

+0

私は文法を修正することができます。私はネイティブではなく、フィードバックをお願いします:) – DryBones

答えて

1

bourneシェル(/bin/sh)にはtimeコマンドがありません。 #!/bin/bashでプログラムを実行してください。

あなたはこのような新しいファイルに記録された時刻を書き込むことができます。

time ./tree <in_1.in> out_1.out 2> time_1.time 

か、OUTFILEの時間が必要な場合:

time ./tree < in_1.in &> out_1.out 

のそれぞれについて、あなたの機能を実行するのは非常に基本的な方法.inファイルはループで動作し、パス名展開*ワイルドカードを使用):

for filename in *.in 
do 
    time ./tree < "$filename" > "$(sed -e 's/in/out/g' <<< $filename)" 
done 

"$(sed -e 's/in/out/g' <<< $filename)"の式は、inout$filenameに置き換えた結果に展開されています。その前後の二重引用符は、glob文字(*?)とファイル名の改行がコードを壊さないようにします。

sedは非常に一般的なツールですが、置換は、すべて試合のsedトリガー代わりにg修飾子に等しい最初のパラメータの後の二重/に注意してください(バッシュのみパターン置換を使用していても短く書くことができますパターン):

time ./tree < "$filename" > "${filename//in/out}" 

の作業ディレクトリにあるか下にあるファイルのセットのためのコマンドを実行する別の非常に一般的なアプローチが原因にこのケースでは難しいかもしれfind -execを、使用していますリダイレクト。

+1

'$(sedの/ in/out/g '<<<" $ filename ")'は'' $ {filename // in/out} ''を実行します。それを引用符で囲むことで、空白やグロブ文字のために改行を防ぐこともできます。このためにコマンド置換を引用することもできます。 –

+0

@ベンジャミンW。ありがとう、私の答えを修正し、遅れていたので間違っていた他のものも修正しました(ファイル名にヌル文字はありません)。 –

+0

実際には、/ usr/bin/timeのような外部実行可能ファイルがあります。 –

関連する問題