【问题标题】:bash set -e function with double pipes带有双管道的 bash set -e 函数
【发布时间】:2016-02-26 20:43:41
【问题描述】:

有人可以解释这种行为吗?我觉得这很奇怪。

#!/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
$ 

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    如果您查看 bash 的手册页,它特别提到了这一点:

    特别是The shell does not exit if the command that fails is part of [...] any command executed in a && or || list except the command following the final && or || [...]

    此行为完全符合记录/预期。

    如果你运行这样的东西,你可以自己看到:

    #!/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.
    

    这正是你这里的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2012-07-12
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多