我对bash的行为以及输入命令时情况的退出状态感到好奇
exit [exit status] | exit [exit status] | .. [repetition of exit and exit status]
它给出了下面的输出。然后,就不会退出。
这是一种未定义的行为吗?
bash-3.2$ exit 1 | exit 2
bash-3.2$ echo $?
2发布于 2021-09-15 07:03:20
流水线中的每个命令都作为单独的进程执行(即,在子subshell中)。
因此,即使是第一个exit也不会退出您的shell,因为它只退出了子shell。
至于退出代码:
管道的返回状态是最后一个命令的退出状态,除非启用了
选项。如果启用了pipefail,则管道的返回状态是以非零状态退出的最后一个(最右侧)命令的值,如果所有命令都成功退出,则返回状态为零。
您可以像这样激活pipefail:
$ set -o pipefail
$ exit 1 | exit 2 | exit 0
$ echo $?
2发布于 2021-09-15 07:26:45
exit 1 | exit 2不是顺序的,而是并发的。
即使最后一个命令采用来自第一个命令的STDOUT输出。What is a simple explanation for how pipes work in Bash?
此外,这些命令中的每一个都在一个子subshell中执行。因此,您键入命令的主shell不会退出。
管道命令就像是整个命令的组合,而不是一个接一个的命令。
如果您想退出,可以将其设置为顺序exit 1 || exit 2。
最后,默认情况下,$?是最新的前台管道退出状态。What are the special dollar sign shell variables?
https://stackoverflow.com/questions/69188389
复制相似问题