【问题标题】:Wait for .sh script to finish before executing another .sh script?在执行另一个 .sh 脚本之前等待 .sh 脚本完成?
【发布时间】:2014-08-08 11:17:43
【问题描述】:

基本上我想运行两个 shell 脚本,但我希望其中一个脚本仅在另一个脚本完成后运行,我将如何执行此操作? 我已经阅读了一些关于直到和同时的内容,但我不太明白如何使用它们。我确信这很简单,但是我对 Linux 很陌生。

【问题讨论】:

  • 我认为这对我的情况没有帮助。我希望一个 shell 脚本启动另一个,然后等待它完成并再次启动它。
  • 如果这是你想要的,那就完全不同了:见there。等待机制由:./script2 & ; some_pid=$! ; wait $some_pid 带来,您将写入您的脚本1,可能在循环中,等等。
  • @jaybee, & ; 是一个语法错误。只是script2 & some_pid=$!...但是当您立即致电等待时,我不清楚这里买了什么;还不如根本没有背景。
  • @STiGYFishh,如果您的第一个脚本只是运行 ./other_script; other_stuff,那么它确实会等待 other_script 完成,然后再自动转到 other_stuff,除非这样其他程序正在专门和有意地做一些事情来分离其父程序。如果你试图等待某件事完成,而它正在积极工作以逃避让其父母知道它何时完成,这是与通常情况不同的问题。
  • 那么,回到最初的问题——@STiGYFishh,为什么你认为这种行为不是你已经得到的开箱即用的行为? (这可能需要您具体说明您正在运行的软件以及它的行为方式,因为某些不符合您要求的异常情况是不寻常的)。

标签: linux shell wait


【解决方案1】:

只需使用&& 连接器(即复合命令):

./script1.sh && ./script2.sh

但请注意,在这种情况下,只有当第一个脚本返回 0 退出代码(即没有错误)时,才会执行第二个脚本。如果您想执行序列,无论第一个脚本的结果如何,只需执行:

./script1.sh ; ./script2.sh

您可以测试两个连接器的行为:

$ true && echo aa
aa
$ false && echo aa
$ false ; echo aa
aa

【讨论】:

  • 这个问题没有说明只有在第一个脚本成功的情况下才运行第二个脚本。 ./script1.sh ; ./script2.sh 应该首先被提及,&& 作为事后的想法。而且你不需要分号;只需将这两个命令放在不同的行上。
【解决方案2】:

让我举个例子:

ScriptA = print msg "I am A" 并在用户输入后休眠 5

ScriptB = print msg "I am B" 并等待用户输入

scriptC = 对 ScriptA 和 ScriptB 的不同调用

脚本A:

 #!/bin/bash
 read -p "I am A"
 sleep 5
 exit

脚本B:

 #!/bin/bash
 read -p "I am B"
 exit

脚本C:

 #!/bin/bash
 ./ScriptA
 ./ScriptB
 exit

现在让我们运行 ScriptC.sh:

 [prompt] $ ./ScriptC.sh
 I am A               (enter)
 //wait for 5         
 I am B               (enter)

所以 ScriptC 在执行下一个命令之前等待每个命令完成,如果您不想等待第一个脚本,您可以在命令后添加 (&) (./ScriptA.sh &)。在这种情况下,ScriptC 将在按下“Enter”后立即执行 ScriptB,并且不会等待 5 秒。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2012-06-26
    • 2014-07-07
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多