Linux 带双管道的bash集-e函数
有人能解释一下这种行为吗?我觉得很奇怪Linux 带双管道的bash集-e函数,linux,bash,Linux,Bash,有人能解释一下这种行为吗?我觉得很奇怪 #!/bin/bash set -e _func() { cat non-existant-file return 0 } _func || echo "Not seen since _func returned zero" _func echo "Not seen since _func returned non-zero" 输出(GNU bash,版本4.3.42(1)-发行版(x86_64-pc-linux-GNU)): 如果您查看
#!/bin/bash
set -e
_func() {
cat non-existant-file
return 0
}
_func || echo "Not seen since _func returned zero"
_func
echo "Not seen since _func returned non-zero"
输出(GNU bash,版本4.3.42(1)-发行版(x86_64-pc-linux-GNU)):
如果您查看bash的手册页,它会特别提到: 特别是
如果失败的命令是在&&或| |列表中执行的[…]任何命令的一部分,则shell不会退出,除了最后的&&或| |[…]之后的命令。
这种行为完全符合记录/预期
如果您运行这样的操作,您可以亲自看到这一点:
#!/bin/bash
set -ex
# set -x will tell you exactly where the shell exits.
_func() {
cat non-existant-file
return 0
}
#_func || echo "Not seen since _func returned zero"
cat non-existant-file || _func
_func
echo "Not seen since _func returned non-zero"
从手册页:
set -e Exit immediately if a pipeline (which may consist of a
single simple command), a list, or a compound command
(see SHELL GRAMMAR above), exits with a non-zero sta‐
tus. The shell does not exit if the command that fails
is part of the command list immediately following a
while or until keyword, part of the test following the
if or elif reserved words, part of any command executed
in a && or || list except the command following the
final && or ||, any command in a pipeline but the last,
or if the command's return value is being inverted with
!. If a compound command other than a subshell returns
a non-zero status because a command failed while -e was
being ignored, the shell does not exit. A trap on ERR,
if set, is executed before the shell exits. This option
applies to the shell environment and each subshell envi‐
ronment separately (see COMMAND EXECUTION ENVIRONMENT
above), and may cause subshells to exit before executing
all the commands in the subshell.
这正是你这里的情况
set -e Exit immediately if a pipeline (which may consist of a
single simple command), a list, or a compound command
(see SHELL GRAMMAR above), exits with a non-zero sta‐
tus. The shell does not exit if the command that fails
is part of the command list immediately following a
while or until keyword, part of the test following the
if or elif reserved words, part of any command executed
in a && or || list except the command following the
final && or ||, any command in a pipeline but the last,
or if the command's return value is being inverted with
!. If a compound command other than a subshell returns
a non-zero status because a command failed while -e was
being ignored, the shell does not exit. A trap on ERR,
if set, is executed before the shell exits. This option
applies to the shell environment and each subshell envi‐
ronment separately (see COMMAND EXECUTION ENVIRONMENT
above), and may cause subshells to exit before executing
all the commands in the subshell.