我正在尝试编写一个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
我是bash脚本新手。有人可以指出问题可能是什么?感谢。
答案 0 :(得分:2)
更改
cmdRun="$mainDirCfg $outFile $2 ${benchmark[$i]}"
$cmdRun
要
eval "$mainDirCfg $outFile $2 ${benchmark[$i]}"
这是因为${benchmark[1]}
中的重定向被视为命令参数,就好像它们被引用一样,而不是真正的重定向。你的第二个程序没有终止,因为它会永远等待从stdin读取的东西,因为重定向不起作用你需要输入的东西(键入Ctrl-D来关闭stdin,你的脚本将继续)。
PS:记住eval is evil,应该避免。