You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:33:04