管道中 `$?` 的正确值是多少?
What is the correct value of `$?` in a pipeline?
发现以下行为让我有点不安:
bash$ false
bash$ true | echo $?
0
bash$ ksh
ksh$ false
ksh$ true | echo $?
0
ksh$ zsh
zsh$ false
zsh$ true | echo $?
1
直觉上,zsh 看起来是正确的,而 bash 和 ksh 是错误的。 $?
是 'the exit status of the most recently executed pipeline',在每种情况下都应为 1。请注意 false | echo $?
在 ksh
和 bash
中也打印 0。标准在这一点上是否灵活(即,行为未指定),或者 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+
POSIX 说:
$?
Expands to the decimal exit status of the most recent [command or] pipeline ...
请注意 的评论。 Bash 在当前版本 4.3.11
中的行为与 zsh
相同。
在 bash
和 zsh
中发生的事情是 $?
将由命令 在 管道之前设置并且在内部不会更改管道。这就是为什么预期结果是 false
-> 1
中的 return 值。这就是 POSIX 指定的内容。
我找不到任何描述 ksh
行为的文档。我只能假设 ksh
在执行管道之前重置 $?
,因为以下代码有效:
#!/bin/ksh
false
ret=$?
true | echo "$ret"
可能这应该作为错误记录在 ksh
中。但是,我不确定 POSIX.
是否充分指定了此行为
发现以下行为让我有点不安:
bash$ false
bash$ true | echo $?
0
bash$ ksh
ksh$ false
ksh$ true | echo $?
0
ksh$ zsh
zsh$ false
zsh$ true | echo $?
1
直觉上,zsh 看起来是正确的,而 bash 和 ksh 是错误的。 $?
是 'the exit status of the most recently executed pipeline',在每种情况下都应为 1。请注意 false | echo $?
在 ksh
和 bash
中也打印 0。标准在这一点上是否灵活(即,行为未指定),或者 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+
POSIX 说:
$? Expands to the decimal exit status of the most recent [command or] pipeline ...
请注意 4.3.11
中的行为与 zsh
相同。
在 bash
和 zsh
中发生的事情是 $?
将由命令 在 管道之前设置并且在内部不会更改管道。这就是为什么预期结果是 false
-> 1
中的 return 值。这就是 POSIX 指定的内容。
我找不到任何描述 ksh
行为的文档。我只能假设 ksh
在执行管道之前重置 $?
,因为以下代码有效:
#!/bin/ksh
false
ret=$?
true | echo "$ret"
可能这应该作为错误记录在 ksh
中。但是,我不确定 POSIX.