Bash等待循环内迭代的完成

时间:2015-10-05 20:49:41

标签: bash matlab for-loop synchronization wait

我写了一个bash脚本,其中有一个for循环,在这个for循环中我调用了一个对我的笔记本电脑来说很重的matlab脚本。有没有办法等待迭代完成然后启动另一个? 这里有我脚本的一部分:

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&

在开始下一次迭代之前?

3 个答案:

答案 0 :(得分:1)

如果您在启动matlab脚本和继续下一次迭代之间需要进行其他处理,则可以插入wait语句暂停,直到matlab完成:< / p>

/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 -

答案 1 :(得分:0)

是的,只需删除尾随&即可在前台执行命令。

默认情况下,shell命令在前台执行,shell等待它们完成以继续到下一行。但是如果在命令末尾添加&,它将在后台执行,并且shell会在命令启动后立即继续执行,而不必等待它完成。

答案 2 :(得分: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