用于运行命令的Bash脚本
问题描述:
我正在尝试编写一个用于运行模拟并将输出文件保存在不同目录中的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
我是新来打坏的脚本。有人可以指出问题可能是什么?谢谢。
答
变化
cmdRun="$mainDirCfg $outFile $2 ${benchmark[$i]}"
$cmdRun
要
eval "$mainDirCfg $outFile $2 ${benchmark[$i]}"
这是因为你在${benchmark[1]}
重定向被视为命令的参数,因为如果他们报价,而不是真正的重定向。你的第二个程序不会终止,因为它永远等待从标准输入读取某些内容,因为重定向不起作用(键入Ctrl-D关闭标准输入并且脚本将继续),因此必须键入内容。 PS:记住eval is evil,应该避免。
你在哪里/如何递增计数器(i)? –
第一个问题是你没有解释你的程序如何失败,第二个问题是你在没有通知的情况下更改了发布的脚本。 – jlliagre
对此我很抱歉。该程序在第二次迭代中失败,因为它没有终止。 '$ cmdRun'是它卡住的那一行。 – titan