gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:55:30 26 4
gpt4 key购买 nike

我有点不安地发现以下行为:

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 | echo $? 还在 kshbash 中打印 0。标准在这一点上是否灵活(即行为未指定),或者 bashksh 在这里不兼容?我也很想知道 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 ...

请注意来自 @lurker 的评论.当前版本 4.3.11 中的 Bash 与 zsh 的行为相同。

bashzsh 中发生的事情是 $? 将由命令管道之前设置并在管道内保持不变。这就是为什么预期结果是 false -> 1 的返回值。这就是 POSIX 指定的内容。

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

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

可能这应该作为 ksh 中的错误归档。但是,我不确定 POSIX 是否充分指定了此行为。

关于bash - 管道中 `$?` 的正确值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com