linux - bash set -e function with double 管道

标签 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)-release (x86_64-pc-linux-gnu)):

$ bash func.sh 
cat: non-existant-file: No such file or directory
cat: non-existant-file: No such file or directory
$ 

最佳答案

如果您查看 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.

这正是你这里的情况。

关于linux - bash set -e function with double 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35651389/

相关文章:

linux - 如何让 SSH 命令中的本地变量和远程变量在本地可用

python - 在 Debian wheezy 上安装 python3-networkx

linux - 在linux上上几个目录

Android Studio 无法在 Linux (CentOS 6.6) 上启动

bash - 单元测试 Bash 脚本

bash - Shell脚本替换文件中的变量-Sed的-i选项错误进行就地更新

linux - 如何在后台一条一条运行命令?

php - 为什么 COMPOSER_HOME 是空的?

linux - 如果 Windows 应用程序无法在其上运行,WSL 有什么好处?

java - 虚拟内存每秒增加 - 内存不足错误