shell bash set -eo pipefail不立即退出

ibps3vxo  于 2023-04-07  发布在  Shell
关注(0)|答案(2)|浏览(218)
#!/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

它正确地记录了该文件不存在,但它继续将其通过管道传输到下一个sha256sumset -eo pipefail是否应该在第一个sha256sum命令时立即退出脚本,而不是通过管道传输到第二个sha256sum

siv3szwd

siv3szwd1#

如果命令失败,pipefail不会导致管道提前中止。管道仍然运行到完成,直到所有命令都退出。无论有没有pipefail,都是如此。
pipefail所做的是确保如果任何命令失败,返回状态为失败。如果没有pipefail,管道仅在 final 命令失败时才会失败。
来自bash手册(重点是添加的):
管道的退出状态是管道中最后一个命令的退出状态,除非启用了pipefail选项如果启用了pipefail,则管道的返回状态是最后一个如果保留字!在流水线之前,则命令以非零状态退出,或者如果所有命令都成功退出则为零。exit状态是如上所述的exit状态的逻辑否定。shell在返回值之前等待管道中的所有命令终止。

o2g1uqev

o2g1uqev2#

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

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

# to reset use
# set +e +o pipefail

相关问题