我发现以下行为有点不安:
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 …
请注意07001的评论.Bash在当前版本4.3.11中的行为与zsh相同.
在bash和zsh中发生的是$?将由管道前的命令设置,并且不会在管道内更改.这就是预期结果是假的返回值的原因 – >这就是POSIX指定的内容.
我找不到任何描述ksh行为的文档.我只能假设ksh重置$?在执行管道之前,由于以下代码有效:
#!/bin/ksh false ret=$? true | echo "$ret"
可能这应该作为ksh中的错误提交.但是,我不确定POSIX是否完全指定了这种行为.