bash set -eo pipelinefail 不立即退出

jch*_*241 3 bash shell

#!/usr/bin/env bash
set -eo pipefail

sha256sum \
    Dockerfile-ci \
    frontend/pnpm-lock.yaml \
| sha256sum
Run Code Online (Sandbox Code Playgroud)

如果frontend/pnpm-lock.yaml不存在,则运行上面的脚本

sha256sum: frontend/pnpm-lock.yaml: No such file or directory
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ica 6

pipefail如果命令失败,不会导致管道提前中止。管道仍会运行直至完成,直到所有命令都退出。无论有或没有,都是如此pipefail

\n

所做pipefail的就是确保如果任何命令失败,返回状态为失败。如果没有pipefail管道,仅当最终命令失败时才会失败。

\n

来自bash 手册(添加了重点):

\n
\n

管道的退出状态是管道中最后一个命令的退出状态,除非pipefail启用该选项(请参阅设置内置)。如果pipefail启用,则 pipeline\xe2\x80\x99s 返回状态是最后一个(最右边)命令以非零状态退出的值,如果所有命令成功退出,则返回零。如果保留字!在管道之前,则退出状态是如上所述的退出状态的逻辑非。shell 在返回值之前等待管道中的所有命令终止。

\n
\n