Bash脚本调用另一个Bash脚本,并等待其完成后再继续。

34
我有一个bash脚本运行另一个bash脚本,但第一个脚本在继续之前不会等待第二个脚本完成,我该如何强制它等待?
例如:
#!/bin/bash
# first.sh

#call to secondary script
sh second.sh
echo "second.sh has completed"

echo "continuing with the rest of first.sh..."

当前的代码会运行 second.sh 脚本,然后继续往下执行,而不会等待 second.sh 脚本执行完毕。


3
应该是等待,这真的是你整个脚本吗? - Carl Norum
5个回答

28

我在几个脚本中使用这样的方案 - 只需在同一个shell副本中调用第二个脚本-使用source进行复制。

脚本1中:

source script2.sh
或者:
. script2.sh

因此,在script-1中的任何命令在script2.sh完成所有任务之前都不会执行。

小例子:

第一个脚本:

$ cat script-1.sh
#!/bin/bash
echo "I'm sccript $0."
echo "Runnig script-2..."

source script-2.sh

echo "script-2.sh finished!"

第二段脚本:

$ cat script-2.sh
#bin/bash
echo "I'm script-2. Running wait operation..."
sleep 2
echo "I'm ended my task."

它是如何工作的:

$ ./script-1.sh
I'm sccript ./script-1.sh.
Runnig script-2...
I'm script-2. Running wait operation...
I'm ended my task.
script-2.sh finished!

如果 script-2.sh 失败了,那么它会调用最后一个 echo 命令还是直接退出? - dev
@etl_devs 我认为它只会以错误退出,并中断脚本-1的执行。 - setevoy
如果脚本2需要参数,那该怎么办?如何进行源码引用? - zookastos

14

通常是可以的;可能是其他情况。您确定另一个脚本没有在后台运行其他内容吗?无论如何,您可以尝试使用wait


6
'wait' 只等待父进程的直接子进程;如果子进程在后台运行并退出,父进程无法等待它,因为它被 'PID 1' - init 进程继承了。(除非有什么巨大的变化我不知道。) - Jonathan Leffler
有没有一种方法可以无论如何都等待?我能不能在被调用的脚本和调用的脚本中都等待? - Radio Controlled

10

在执行第二个脚本之后,您可以简单地添加命令wait,它将等待从您的主要脚本启动的所有进程

您甚至可以使用命令echo $!在调用第二个脚本之后直接恢复第二个脚本的PID,并将此PID作为参数传递给wait命令。


1
尝试使用 bash second.sh 命令,并检查您的 second.sh 文件,确保没有在后台运行的程序。

-1

另一种方法是使用$(second.sh)


那将尝试将second.sh的输出作为命令运行。如果它打印出rm -rf *会怎么样? - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接