加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:14:04 所属栏目:安全 来源:网络整理
导读:我发现以下行为有点不安: bash$falsebash$true | echo $?0bash$kshksh$falseksh$true | echo $?0ksh$zshzsh$falsezsh$true | echo $?1 直观地说,看起来zsh正确,而bash和ksh是错误的. $?是’最近执行的管道的退出状态’,在每种情况下应该是1.注意false |回
我发现以下行为有点不安:
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是否完全指定了这种行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读