我是否正确地假设当;
在一行上连接两个命令时,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 会等待所有命令完成,直到继续执行。