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 ksh
和bash
.是标准的灵活的在这一点上(即行为是不确定的),或者是bash
和ksh
不符合要求的吗?我也很想知道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)
POSIX说:
$?扩展到最近的[命令或]管道的十进制退出状态...
请注意@lurker的评论。当前版本中的 Bash 的4.3.11
行为与zsh
.
bash
和中发生的情况zsh
将由管道之前的$?
命令设置,并且在管道内部不会更改。这就是为什么预期结果是->的返回值。这就是 POSIX 所指定的。false
1
我找不到任何描述该ksh
行为的文档。我只能假设在执行管道之前ksh
重置,因为以下代码有效:$?
#!/bin/ksh
false
ret=$?
true | echo "$ret"
Run Code Online (Sandbox Code Playgroud)
也许这应该作为一个错误归档ksh
。但是,我不确定 POSIX 是否足够准确地指定了这种行为。