在Ubuntu 16上进行bash:设置-e在子壳中不继承



当我运行此命令

set -e; echo $(echo "$-");

我将himBH作为输出。我期望字母e包含在输出中。怎么了?

我在Ubuntu 16.04.1 LTS上GNU BASH,版本4.3.46(1)-Release(x86_64-pc-linux-gnu)

命令替换不继承errexit选项,除非您处于POSIX模式或使用inherit_errexit Shell选项(添加到bash 4.4)。

192% bash -ec 'echo "$(echo "$-")"'
hBc
192% bash --posix -ec 'echo "$(echo "$-")"'
ehBc
192% bash -O inherit_errexit -ec 'echo "$(echo "$-")"'  # 4.4+
ehBc

这个问题!在我找到HTI的直到我发现HTIS之前工作了几个小时。

我无法将set -e继承为子壳。

这是我的概念证明:

#!/usr/bin/env bash
set -euo pipefail
# uncomment to handle failures properly
# shopt -s inherit_errexit
function callfail() {
  echo "SHELLOPTS - callfail - $SHELLOPTS" >&2
  local value
  value=$(fail)
  echo "echo will reset the result to 0"
}
function fail() {
  echo "SHELLOPTS - fail     - $SHELLOPTS" >&2
  echo "failing" >&2
  return 1
}
function root() {
  local hello
  hello=$(callfail)
  echo "nothing went bad in callfail"
  callfail
  echo "nothing went bad in callfail"
}
root

没有shopt -s inherit_errexit的执行:

$ ./test.sh         
SHELLOPTS - callfail - braceexpand:hashall:interactive-comments:nounset:pipefail
SHELLOPTS - fail     - braceexpand:hashall:interactive-comments:nounset:pipefail
failing
nothing went bad in callfail
SHELLOPTS - callfail - braceexpand:errexit:hashall:interactive-comments:nounset:pipefail
SHELLOPTS - fail     - braceexpand:hashall:interactive-comments:nounset:pipefail
failing

shopt -s inherit_errexit执行:

$ ./test.sh
SHELLOPTS - callfail - braceexpand:errexit:hashall:interactive-comments:nounset:pipefail
SHELLOPTS - fail     - braceexpand:errexit:hashall:interactive-comments:nounset:pipefail
failing

相关内容

  • 没有找到相关文章

最新更新