【发布时间】:2021-09-01 11:10:47
【问题描述】:
我有一个如下所示的 bash 脚本:它运行带有不同参数的 python 脚本,每个参数都作为后台进程(注意我使用了 '&')
#!/bin/bash
declare -a arr=("arg1" "arg2" "arg3")
for i in "${arr[@]}"
do
echo "$i"
python3 test.py $i &
echo "hi"
done
exit
test.py文件如下:
import sys
print('Argument List:', str(sys.argv))
我尝试使用命令 ./bash_script_test.sh 运行 bash 脚本。 输出也是正确的,但脚本只是没有结束运行。加上 python 代码的输出从一个新的命令行开始。请参阅下面的输出。
arg1
hi
arg2
hi
arg3
hi
[root@csit-openstack1 risav]# Argument List: ['test.py', 'arg2']
Argument List: ['test.py', 'arg3']
Argument List: ['test.py', 'arg1']
为什么会出现一个新的命令行,为什么 shell 脚本没有退出?是因为使用 & 吗?如果有,谁能解释一下?
【问题讨论】:
-
您看到“新命令行(提示)”的原因是因为主脚本已经完成并且您看到了命令行(提示);
py输出输出滞后并被转储到终端...在适当的时候;根据前台/后台处理速度,您可以重复运行脚本并查看以不同顺序生成的一些输出行......并且在某些终端中甚至可能在同一行出现乱码;正如您所知道的(根据您的评论 - 下面),在bash脚本中添加wait将确保脚本真的不会结束...... -
... 直到后台进程完成,此时您将看到命令行(提示);试试这个……给
py代码添加一个睡眠,删除wait,运行你的脚本,一旦你看到命令行(提示)(即bash脚本已经完成)然后运行@987654330 @ ... 你会看到你的ls输出,然后在某个时候py输出会出现在你的终端中