bash 模式的意义是什么[...] & wait $!
?例如:
curl -LsS $AZP_AGENT_PACKAGE_LATEST_URL | tar -xz & wait $!
我将其理解为:
&
指示 bash 在后台子 shell 中运行先前的管道。- 然后
wait $!
在返回之前等待管道完成。
但如果是这样的话,它与仅仅运行管道本身有什么不同呢?重点是什么?
包含此示例(以及其他一些实例)的脚本可以在以下位置找到:
https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/docker?view=azure-devops
A
在非交互式 shell中异步运行命令有两个副作用A & wait "$!"
:SIGINT 和 SIGQUIT 被忽略
A
。如果您在运行时按Ctrl+ ,您会注意到已终止,但不是。Cbash -c 'sleep 1000 & wait "$!"'
bash
sleep
A
的标准输入重定向到/dev/null
:另一个区别是在
A | B & wait "$!"
(其中$!
包含最终运行的进程的pidB
)中,退出状态A
为丢失($PIPESTATUS
将仅包含一个条目,即退出状态wait
,B
如果pipefail
未设置选项,则为退出状态)。in
zsh
, inA | B
,zsh
都等待A
andB
,但 inA | B & wait $!
只等待B
(即使有 ,退出状态A
也会丢失pipefail
)。另一个区别是,如果一个信号被传递到 shell,它将被立即处理并
wait
返回(即使它正在等待的进程没有完成)。相比:
发送到哪里(并在终止后继续运行)
Ouch
输出:SIGTERM
bash
sleep 10
bash
哪里
Ouch
是返回后才输出sleep 10
。脚本作者是否想要这些副作用是另一回事。您会注意到该脚本中的许多其他错误,很可能编写该脚本的人对 shell 脚本了解不多。