2015-10-05 40 views
1

我寫了一個bash腳本,其中有一個for循環,在這個for循環中,我調用了一個對我的筆記本電腦來說很重的matlab腳本。有沒有辦法等待迭代的完成,然後啓動另一個? 這裏有我的腳本的一部分:Bash等待循環內迭代的完成

for f in $FILES 
do 
    echo "Processing file... $f" 
    cp $f $BASEDIR/$RESULTS/$filename/ 
    echo "generating data for matlab ..." 
    ./../../../matlab/graphic_file_gen $f > data_matlab.txt 
    if [[ $f == *fsr12* ]]; then 
    fullPath=$BASEDIR/$RESULTS/$filename/data_matlab.txt 
    cd /home/myname/Desktop/test/ 
    fsr=12; 
    /usr/local/MATLAB/R2015a/bin/matlab -nodisplay -nojvm -nodesktop -r "fullPath='$fullPath'; fsr='$fsr' ; fit_exp_real_data" > $BASEDIR/$RESULTS/$filename/result_matlab.txt</dev/null& 
    cd - 
    fi 
    cd $BASEDIR/$DECADIMENTI 
done 

末的問題是:有沒有辦法等待這條線的完成?

/usr/local/MATLAB/R2015a/bin/matlab -nodisplay -nojvm -nodesktop -r "fullPath='$fullPath'; fsr='$fsr' ; fit_exp_real_data" > $BASEDIR/$RESULTS/$filename/result_matlab.txt</dev/null& 

開始下一次迭代之前?

+5

只要把'&&放在最後? –

回答

0

是的,只需刪除尾部&以使命令在前臺執行。

默認情況下,shell命令在前臺執行,shell等待它們完成以繼續到下一行。但是,如果在命令末尾添加&,它會在後臺執行,並且shell在命令啓動後立即繼續執行,而不等待它完成。

0

按照Ben Voigt和ÁlvaroGutiérrez的見解,我注意到一部分腳本似乎是多餘的。試試這個修改後的版本:

for f in $FILES 
do 
    echo "Processing file... $f" 
    cp $f $BASEDIR/$RESULTS/$filename/ 
    echo "generating data for matlab ..." 
    ./../../../matlab/graphic_file_gen $f > data_matlab.txt 
    if [[ $f == *fsr12* ]]; then 
    fullPath=$BASEDIR/$RESULTS/$filename/data_matlab.txt 
    cd /home/myname/Desktop/test/ 
    fsr=12; 
    /usr/local/MATLAB/R2015a/bin/matlab -nodisplay -nojvm -nodesktop -r "fullPath='$fullPath'; fsr='$fsr' ; fit_exp_real_data" > $BASEDIR/$RESULTS/$filename/result_matlab.txt 
    cd - 
    fi 
    cd $BASEDIR/$DECADIMENTI 
done 
1

如果您有其他的處理你想開始matlab腳本,並持續到下一次迭代之間的事,你可以插入一個wait聲明暫停,直到matlab完成:

/usr/local/MATLAB/R2015a/bin/matlab ... & 
# Do more here 
wait 
cd - 

然而,在這裏,你似乎並不需要在後臺運行腳本可言,所以只是省略&

/usr/local/MATLAB/R2015a/bin/matlab... 
# Script pauses while matlab runs. Once it returns, the script continues 
cd -