bash set -eo pipefail 不立即退出的原因

3
#!/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
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

它正确地记录了文件不存在的情况,但仍然将其传递到下一个sha256sum命令中。根据set -eo pipefail的设置,第一个sha256sum应该立即退出脚本,而不是继续传递到第二个sha256sum命令中,这样做是否正确?
2个回答

6
pipefail 不会在命令失败时使管道提前中止,管道仍然会一直运行直到所有命令退出。这对于有或者没有启用 pipefail 都是正确的。 pipefail 能做到的是,确保如果任何一个命令失败了,返回状态码为失败。如果没有启用 pipefail,管道只有在最后一个命令失败时才会失败。
来自 bash 手册(已加重点):
“管道的退出状态是管道中最后一个命令的退出状态,除非启用了 pipefail 选项(参见 The Set Builtin)。如果启用了 pipefail,则管道的返回状态是最后一个(最右边的)以非零状态退出的命令的值,或者如果所有命令都成功退出,则为零。如果保留字 ! 在管道之前,则退出状态是上述描述的退出状态的逻辑否定。 在返回值之前,shell 等待管道中的所有命令终止。

-2

尝试使用下面的标志,然后它就可以工作了。我已经验证过了。

#!/bin/bash
set -e -o pipefail

# to reset use
# set +e +o pipefail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接