在 bash 中,每当一个命令的输出通过管道传输到另一个命令时,退出值(变量$?
)将从哪个命令返回?输出通过管道传输的命令,还是输出通过管道传输到的命令?
例如,在命令中说:
git diff | vim -
变量是$?
来自git diff
命令,还是vim -
命令本身?
答案1
管道中的最后一个命令。
$ false | echo -n
$ echo $?
0
$ true | echo -n
$ echo $?
0
$ true | echo -n | false
$ echo $?
1
答案2
man bash
说:
? Expands to the exit status of the most recently executed fore‐
ground pipeline.
和:
The return status of a pipeline is the exit status of the last command,
unless the pipefail option is enabled.
答案3
保留$?
管道中最后执行的命令的状态,但如果您想检查管道内命令的状态,请使用变量PIPESTATUS
,即
一个数组变量(参见数组),包含最近执行的前台管道(可能只包含单个命令)中进程的退出状态值列表。
git diff
在您的示例中,可以从中读取的返回状态${PIPESTATUS[0]}
。