考虑以下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 pipefail
对eval
没有影响。所以grep命令不会导致bash脚本退出。
答案 0 :(得分:1)
只要以bash
方式调用bash,您就会大致纠正,除了$(...)
而不是eval
,它会抑制-e
1}}。请注意,如果它可以被称为sh
(或bash --posix
):这是the list of changes between POSIX and non-POSIX mode上的第40项:
- 启用POSIX模式可以设置 ' inherit_errexit'选项,因此子shell产生执行命令 替换继承了' -e'的价值。来自父母的选项 贝壳。当'inherit_errexit'选项未启用,Bash 清除' -e'这种子壳中的选项。
醇>