2016-12-02 205 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