#!/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条答案
按热度按时间siv3szwd1#
如果命令失败,
pipefail
不会导致管道提前中止。管道仍然运行到完成,直到所有命令都退出。无论有没有pipefail
,都是如此。pipefail
所做的是确保如果任何命令失败,返回状态为失败。如果没有pipefail
,管道仅在 final 命令失败时才会失败。来自bash手册(重点是添加的):
管道的退出状态是管道中最后一个命令的退出状态,除非启用了
pipefail
选项如果启用了pipefail
,则管道的返回状态是最后一个如果保留字!
在流水线之前,则命令以非零状态退出,或者如果所有命令都成功退出则为零。exit状态是如上所述的exit状态的逻辑否定。shell在返回值之前等待管道中的所有命令终止。o2g1uqev2#
尝试使用下面的标志,然后它的工作。我已经验证了它。