从shell脚本在后台执行命令?

时间:2020-05-15 03:05:12

标签: bash

我有一个bash脚本,其中包含以下命令。

baskets

请注意,结尾处有docker-compose -f ./local/d-compose.yml build & 。我了解,如果直接在bash shell提示符下执行,则该命令将在后台执行。 但是,我不明白如果在bash脚本中执行此操作将如何处理。

此外,如果我用&而不是source <script_name>运行脚本,又会有什么不同?

1 个答案:

答案 0 :(得分:3)

Unix / Linux中的job control指令&要求它以后台作业的形式运行该指令,使您返回shell命令提示符。

该特殊指令在前台运行的脚本中执行,将如上所述执行,即在后台模式下运行(在子shell中,如果使用source,则不运行),而其余的脚本继续在前台模式下按顺序运行。

具有5条指令的bash脚本的示例,该脚本在前台执行(调用后没有&):

#! /bin/bash

ls a*
ls b*
ls c* &
ls d*
ls e*

在这种情况下,脚本将调用第一个ls,等待其完成,然后调用第二个ls,等待其完成,并使用&调用第三个ls。在这里,操作系统会将作业放在后台,并立即将控制权返回给脚本,而无需等待完成。因此,脚本将立即继续并调用第四个ls,等待其完成,最后调用第五个ls。

因此,对于通话/执行,您将获得

  1. 第一个ls叫
  2. 首先执行ls
  3. 第二个ls
  4. 第二次执行
  5. 第三个ls
  6. 第四个ls
  7. 第四个ls
  8. 第五个ls
  9. 第五次执行ls

对于第三个ls,它将在步骤5之后的任何时间结束执行,实际上是将其结果散布在第四个或第五个ls调用之间。

使用source不会改变该行为,仅在当前shell中执行脚本(使用source)或在子shell中执行脚本(不使用source) 。