Bash 等待循环内迭代的完成
Bash wait the completion of an iteration inside loop
我写了一个 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&
在开始下一次迭代之前?
是的,只需删除尾部的 &
即可使命令在前台执行。
默认shell命令在前台执行,shell等待它们完成以继续下一行。但是如果在命令末尾添加 &
,它会在后台执行,并且 shell 在命令开始后立即继续执行,而不是等待它完成。
根据 Ben Voigt 和 Álvaro Gutié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
如果您在启动 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 -
我写了一个 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&
在开始下一次迭代之前?
是的,只需删除尾部的 &
即可使命令在前台执行。
默认shell命令在前台执行,shell等待它们完成以继续下一行。但是如果在命令末尾添加 &
,它会在后台执行,并且 shell 在命令开始后立即继续执行,而不是等待它完成。
根据 Ben Voigt 和 Álvaro Gutié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
如果您在启动 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 -