连续命令

连续命令

我是否正确地假设当;在一行上连接两个命令时,Bash 总是等到第一个命令退出后再执行第二个命令?同样,在不同行包含两个不同命令的 shell 脚本中,Bash 总是等到第一行的命令退出后才执行第二行的命令?

如果是这种情况,是否有办法在一行或脚本中执行两个命令,以便第二个命令不会等到第一个命令完成?

另外,shell 脚本中的不同行是否相当于由;或连接的单独行&&

答案1

你是对的,脚本中的命令默认是按顺序执行的。

您可以在后台运行命令,方法是在命令后面添加后缀&(单个 & 符号)。

单独行上的命令相当于;默认情况下使用 结合的命令。如果您告诉 shell 在非零退出代码 ( set -e) 上中止,则脚本将执行,就像所有命令都与 一起执行一样&&

答案2

要回答第二个问题,您可以&在后台启动命令并继续执行脚本,而无需等待其完成。

commandA & commandB

如果您在交互式终端(而不是脚本)上运行此命令,则可以使用fg它使后台命令重新成为焦点,或jobs查看后台任务列表。

答案3

在最简单的情况下,当您完全控制前一个过程时,您可以将下一个命令链接到firstCommand && secondCommand其他答案中已经提到的。该语法意味着firstCommand承担返回正确退出代码的责任(0成功时返回正确的退出代码,失败时返回非零值),并且secondCommand只有在firstCommand成功退出时才会运行。

当你这样做时不是可以控制firstCommand或何时它已经运行,或者何时firstCommand在成功/失败时不返回正常的退出代码,那么您可以每 N 秒轮询一次正在运行的进程,并secondCommand在第一个退出后启动:

while true ; do pgrep firstCommand && echo 'Still running...' || secondCommand ; sleep 1 ; done

❗️警告:secondCommand即使firstCommand以非零退出状态完成,也会运行。

另请参阅:

答案4

正如其他人所说,您必须在应在后台运行的命令末尾添加 & 符号。

如果您希望脚本同时完成所有任务然后退出,只需在脚本末尾添加“wait”命令即可。在这种情况下,bash 会等待所有命令完成,直到继续执行。

相关内容