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

上記のスクリプトは、2番目のものではなく最初の繰り返しで正しく動作します。ただし、コマンドプロンプトでコマンドを個別に実行すると、予想される出力が得られます。 2回目の繰り返しで実行するコマンドは、次のとおりです。

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

私はbashスクリプトの初心者です。誰かが問題の原因を指摘できますか?ありがとう。彼らは、真ではないリダイレクトを引用しているかのよう${benchmark[1]}であなたのリダイレクトは、コマンド引数として見られているので、

+0

ここで/(どのように)カウンター(i)をインクリメントしていますか? –

+2

最初の問題は、プログラムがどのように失敗するのか説明できないことです。もう1つは通知されたスクリプトを通知なしに変更したことです。 – jlliagre

+0

私はそれについて残念です。プログラムは、終了しないという意味で2回目の反復で失敗します。 '$ cmdRun'はスタックされた行です。 – titan

答えて

2

変更

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

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

にこれがあります。 2番目のプログラムは、リダイレクトが機能しないので入力しなければならない標準入力から何かを永久に待つため、終了しません(Ctrl + Dキーを押すと標準入力を閉じてスクリプトが続行されます)。

PS:覚えておいてくださいeval is evilと避けてください。

+0

ソリューションが機能しました。どうもありがとうございます! – titan

+1

@titanできるだけ 'eval'を使用しないでください。あなたがbashの構文を完全に理解していなければ、それは巨大なバグのマグネットです(そして、質問から、あなたはbash構文を理解できないことを保証します)。 'eval'では、最初はうまくいくものを作るのがはるかに簡単ですが、わずかに異なる状況下では奇妙に失敗します。 –

+0

右、私はPSに義務的な警告を追加しました – xhienne

関連する問題