如何轻松找出 bash/zsh 管道的哪一部分由于“set -o pipelinefail”而失败?

Cor*_*mer 4 bash zsh pipe

我有一个带有多个管道的 bash/zsh 命令|,在使用set -o pipefail. 为简单起见,假设命令是

set -o pipefail; echo "123456" | head -c2 | grep 5 | cat
Run Code Online (Sandbox Code Playgroud)

如何快速找出哪个命令首先失败以及原因?我知道我可以检查退出代码,但这并不能显示管道的哪一部分首先失败。

有没有比逐个构建管道并检查第一个失败退出代码的相当冗长的检查更简单的方法?

编辑:我删除了我编写的人为代码示例,因为它使人们对我询问的目的感到困惑。提示这个问题的实际命令是:

set -o pipefail; echo "123456" | head -c2 | grep 5 | cat
Run Code Online (Sandbox Code Playgroud)

Cor*_*mer 5

echo "${PIPESTATUS[@]}"在 bash 中,在命令后面使用以获取空格分隔列表中每个组件的退出状态:

#!/bin/bash
$ set -o pipefail; echo "123456" | head -c2 | grep 5 | cat

$ echo ${PIPESTATUS[@]}
0 0 1 0
Run Code Online (Sandbox Code Playgroud)

zsh用户注意,您需要使用小写字母pipestatus

#!/bin/zsh
$ set -o pipefail; echo "123456" | head -c2 | grep 5 | cat

$ echo $pipestatus
0 0 1 0
Run Code Online (Sandbox Code Playgroud)

fish也可以简单地使用echo $pipestatus相同的输出。