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

我发现以下行为有点不安:
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是错误的. $?是’最近执行的管道的退出状态’,在每种情况下应该是1.注意false |回声$?还会在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 …

请注意0​​7001的评论.Bash在当前版本4.3.11中的行为与zsh相同.

在bash和zsh中发生的是$?将由管道前的命令设置,并且不会在管道内更改.这就是预期结果是假的返回值的原因 – >这就是POSIX指定的内容.

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

#!/bin/ksh
false
ret=$?
true | echo "$ret"

可能这应该作为ksh中的错误提交.但是,我不确定POSIX是否完全指定了这种行为.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...