2016-12-02 307 views
0

我正在嘗試編寫一個用於運行模擬並將輸出文件保存在不同目錄中的Bash腳本。我到目前爲止的代碼是:用於運行命令的Bash腳本

mainDirCfg="/home/software/simplesim/simplesim-3.0/sim-outorder -config ../$1" 
outFile="-redir:sim" 
declare -a benchmark=("bzip2_base.i386-m32-gcc42-nn dryer.jpg" "equake_base.pisa_little <inp.in> inp.out") 
declare -a directory=("bzip2" "equake") 
i=0 
for d in "${directory[@]}" 
do 
    cd $d 
    cmdRun="$mainDirCfg $outFile $2 ${benchmark[$i]}" 
    # above is the command to be run 
    $cmdRun 
    cd .. 
    ((i++)) 
done 

以上腳本的正常運行對於第一次迭代的不是第二個。但是,在命令提示符處單獨運行命令時,我會得到預期的輸出。我第二次迭代運行的命令如下:

/home/software/simplesim/simplesim-3.0/sim-outorder -config ../tmp.cfg -redir:sim tmp9.out equake_base.pisa_little <inp.in> inp.out 

我是新來打壞的腳本。有人可以指出問題可能是什麼?謝謝。

+0

你在哪裏/如何遞增計數器(i)? –

+2

第一個問題是你沒有解釋你的程序如何失敗,第二個問題是你在沒有通知的情況下更改了發佈的腳本。 – jlliagre

+0

對此我很抱歉。該程序在第二次迭代中失敗,因爲它沒有終止。 '$ cmdRun'是它卡住的那一行。 – titan

回答

2

變化

cmdRun="$mainDirCfg $outFile $2 ${benchmark[$i]}" 
$cmdRun 

eval "$mainDirCfg $outFile $2 ${benchmark[$i]}" 

這是因爲你在${benchmark[1]}重定向被視爲命令的參數,因爲如果他們報價,而不是真正的重定向。你的第二個程序不會終止,因爲它永遠等待從標準輸入讀取某些內容,因爲重定向不起作用(鍵入Ctrl-D關閉標準輸入並且腳本將繼續),因此必須鍵入內容。 PS:記住eval is evil,應該避免。

+0

您的解決方案工作。非常感謝! – titan

+1

@titan請儘量避免使用'eval';如果你沒有完全理解bash語法(這個問題,我保證你不理解bash語法),這是一個巨大的bug磁鐵。使用'eval',首先很容易做出一些起作用的東西,但是在稍微不同的情況下卻很奇怪。 –

+0

對,我在PS中加入了強制性警告 – xhienne