小编Hir*_*i_U的帖子

即使设置了 -e,函数内的命令替换也不会在失败时停止脚本

我有一个以下脚本sandbox.sh

#!/bin/bash
set -eu -o pipefail -E

function func1() {
  echo "FUNC1"
  exit 1
}

function func2() {
  local ret
  ret=$(func1)
  echo $ret
  echo "(func2)This line shouldn't be reached:'${?}'" >&2
}

var=$(func1) # The Line
echo "main:This line shouldn't be reached:'${var}':'${?}'" >&2
Run Code Online (Sandbox Code Playgroud)

(GNU bash,版本 4.4.20(1)-release (x86_64-pc-linux-gnu))

这会按预期停止执行,

$ bash -eu sandbox.sh 
$ 
Run Code Online (Sandbox Code Playgroud)

但是,如果我将“The Line”修改为var=$(func2)call func1through func2,它将给出以下输出

$ bash sandbox.sh 
(func2)This line shouldn't be reached:'0'
main:This line shouldn't be reached:'FUNC1':'0'
$ 
Run Code Online (Sandbox Code Playgroud)

对我来说,当命令替换放置在函数中时,它的行为似乎有所不同,但我不明白为什么 bash 是这样设计的。另外,很可能出现一个函数的输出被另一个函数使用的情况,这种差异令人困惑。

注意:如果我像下面这样重写 …

bash shell-script

7
推荐指数
1
解决办法
2087
查看次数

标签 统计

bash ×1

shell-script ×1