繁体   English   中英

bash set -e函数有双管道

[英]bash set -e function with double pipes

有人可以解释这种行为吗? 这对我来说似乎很奇怪。

#!/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的联机帮助页,它会特别提到:

特别是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 || [...] 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.

这就是你的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM