为何Docker中set -eux pipefail未生效?返回码仍为0
问题原因分析
1. set命令语法错误,未正确开启pipefail选项
你写的set -eux pipefail是错误的语法:
-eux是单字母短选项,可以组合使用,但pipefail是长选项,必须通过-o参数指定,正确写法为set -eux -o pipefail或set -euxo pipefail。- 原命令中,Alpine默认的ash shell会把
pipefail当作普通参数而非选项,导致pipefail根本没被开启,set -e只能按默认规则生效。
2. set -e默认仅监测管道最后一个命令的退出状态
未开启pipefail时,set -e只会关注管道末尾命令的退出码:
temp命令不存在会报错退出(非0码),但sed处理空输入仍能正常退出(0码);- 管道整体退出码取最后一个命令的0值,
set -e判定整个管道执行成功,不会终止脚本,后续通过&&连接的命令会继续执行,最终docker run返回0。
3. 正确开启pipefail后的效果
Alpine使用的busybox ash支持pipefail选项,开启后管道的退出码会变为第一个失败命令的码(即temp的非0值),此时set -e会触发脚本终止,后续命令不再执行,docker run也会返回非0退出码。
修正后的命令示例
docker run <container-name> \ sh -c "set -eux -o pipefail && temp | sed 's/temp/perma/g'"
内容的提问来源于stack exchange,提问作者xihare
相关产品推荐
相关产品推荐

