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

前端之家收集整理的这篇文章主要介绍了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是否完全指定了这种行为.

猜你在找的Bash相关文章