为何设置set -eo pipefail后脚本未在sha256sum出错时立即退出?
Bash脚本中
set -eo pipefail未按预期退出的原因 测试脚本
#!/usr/bin/env bash set -eo pipefail sha256sum \ Dockerfile-ci \ frontend/pnpm-lock.yaml \ | sha256sum
问题现象
当frontend/pnpm-lock.yaml文件不存在时运行该脚本,会输出错误日志:
sha256sum: frontend/pnpm-lock.yaml: No such file or directory
同时脚本仍会将前一个sha256sum的输出传入后续的sha256sum,最终输出哈希值e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855。按预期set -eo pipefail应该让脚本在第一个sha256sum出错时立即退出,不执行后续管道操作,这一现象的原因是什么?
原因解析
核心原因是**sha256sum在处理部分存在的文件时,不会以非零状态码退出**。
当你给sha256sum传入多个文件,其中部分存在、部分不存在时:
- 它会对每个存在的文件正常计算哈希并输出
- 对不存在的文件输出错误信息到标准错误流(stderr)
- 但最终的退出状态码是0(成功),只有当所有传入的文件都不存在,或者发生其他严重错误时,它才会返回非零状态码
而set -e的作用是当命令返回非零状态码时终止脚本,pipefail是让管道的整体状态码等于管道中最后一个非零的命令状态码。但这里第一个sha256sum实际返回的是0,所以set -e不会触发退出,pipefail也不会改变管道的状态码,后续的sha256sum自然会继续执行。
你看到的错误日志只是sha256sum输出到stderr的提示,不代表它的退出状态是失败。
内容的提问来源于stack exchange,提问作者jchi2241
相关产品推荐
相关产品推荐

