管道中`$?`的正确值是多少?

Wil*_*ell 8 bash shell ksh zsh sh

我有点不安地发现以下行为:

bash$ false
bash$ true | echo $?
0
bash$ ksh
ksh$ false
ksh$ true | echo $?
0
ksh$ zsh
zsh$ false
zsh$ true | echo $?
1
Run Code Online (Sandbox Code Playgroud)

直观地说,看起来zsh是正确的,而bash和ksh是错误的. $?是,在每种情况下,应该是1.注意,"最近执行流水线的退出状态" false | echo $?两个也打印0 kshbash.是标准的灵活的在这一点上(即行为是不确定的),或者是bashksh不符合要求的吗?我也很想知道bash和ksh正在做些什么来解决这个问题.

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.
$ zsh --version
zsh 4.3.11 (i386-apple-darwin11.0)
$ ksh --version
  version         sh (AT&T Research) 1993-12-28 s+
Run Code Online (Sandbox Code Playgroud)

hek*_*mgl 4

POSIX说:

$?扩展到最近的[命令或]管道的十进制退出状态...

请注意@lurker的评论。当前版本中的 Bash 的4.3.11行为与zsh.

bash和中发生的情况zsh将由管道之前的$?命令设置,并且在管道内部不会更改。这就是为什么预期结果是->的返回值。这就是 POSIX 所指定的。false1

我找不到任何描述该ksh行为的文档。我只能假设在执行管道之前ksh重置,因为以下代码有效:$?

#!/bin/ksh
false
ret=$?
true | echo "$ret"
Run Code Online (Sandbox Code Playgroud)

也许这应该作为一个错误归档ksh。但是,我不确定 POSIX 是否足够准确地指定了这种行为。

  • 是的,所以在每种情况下“$?”应该是“false”返回的状态。它应该引用最新的管道,并且正在使用它的管道的构造应该是无关的。 (2认同)