“set -euo pipefail”会对eval产生影响吗?

时间:2016-09-18 06:39:00

标签: bash shell eval

考虑以下bash代码:

#!/usr/bin/env bash

set -euo pipefail

Test() {      
  grep 'XXX' data
  echo 'test message'
}

data是与上述bash脚本位于同一目录中的空文件。

如果使用以下代码调用Test函数,则它不会向stdout生成任何内容。

Test

原因是grep命令返回退出状态1,因为data不包含XXX。因此set -euo pipefail会导致bash脚本立即退出。

但如果用:

调用它
output=$(eval 'Test')
echo "output: $output"

它向stdout生成以下消息:

output: test message

似乎set -euo pipefaileval没有影响。所以grep命令不会导致bash脚本退出。

1 个答案:

答案 0 :(得分:1)

只要以bash方式调用bash,您就会大致纠正,除了$(...)而不是eval,它会抑制-e 1}}。请注意,如果它可以被称为sh(或bash --posix):这是the list of changes between POSIX and non-POSIX mode上的第40项:

  
      
  1. 启用POSIX模式可以设置    ' inherit_errexit'选项,因此子shell产生执行命令    替换继承了' -e'的价值。来自父母的选项    贝壳。当'inherit_errexit'选项未启用,Bash    清除' -e'这种子壳中的选项。
  2.