2017-09-11 55 views
1

我通過腳本多次運行一個程序,但我需要獲得每次運行它的時間。我試圖通過終端使用「時間」功能,就像我通過終端使用「時間」功能一樣,但它並不真正起作用。這裏是我的代碼用腳本里面的「時間」功能:如何測量shell腳本的每個「子進程」的執行時間

#!/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 shell中沒有time命令(/bin/sh)。用#!/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)"擴展到in替換out$filename中的結果。圍繞它的雙引號可防止全局字符(*,?)和文件名中的換行符破壞您的代碼。

sed是一種很常見的工具,但取代可以使用bash-僅模式替換(注意它等於g改性劑sed觸發的所有匹配替代所述第一參數後的雙/寫入甚至更短的圖案):

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

一組中或工作目錄下找到的文件的執行命令的另一種非常常見的方法是使用find -exec,其可以在此情況下是困難的,由於重定向。

+1

'$(sed's/in/out/g'<<<「$ filename」)'可以被替換爲''$ {filename //輸入/輸出}「'不產生子外殼。引用它還可以防止由於空格或水平字符造成的破壞。你也可以爲此引用命令替換。 –

+0

@BenjaminW。謝謝,修改了我的答案,並更正了一些其他錯誤的東西,因爲它遲了(文件名中沒有空字符)。 –

+0

實際上有一個外部可執行文件,類似於/ usr/bin/time –