Bash 中管道命令的退出值

Bash 中管道命令的退出值

在 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]}

相关内容