bash - PIPESTATUS 忽略否定?

标签 bash shell negation exitstatus pipestatus

我刚刚在 bash(版本 4.2.25(1)-release)中发现了以下结果:

$ true; echo "${PIPESTATUS[@]}"
0
$ ! true; echo "${PIPESTATUS[@]}"
0
$ false; echo "${PIPESTATUS[@]}"
1
$ ! false; echo "${PIPESTATUS[@]}"
1
$ true && false; echo "${PIPESTATUS[@]}"
1
$ true && ! false; echo "${PIPESTATUS[@]}"
1

因此,$PIPESTATUS 似乎在所有情况下都会忽略否定。这是一个已知的问题?我找不到任何相关信息。或者这是一种想要的行为?如果是这样,其背后的原因是什么?

当使用子 shell 时,一切都按照我的预期工作:

$ (true && ! false); echo "${PIPESTATUS[@]}"
0

最佳答案

我认为这种行为是有意为之,并且如果通过完整的管道查看就会变得更加清晰:

a | b | c | d ; echo "${PIPESTATUS[@]}"

这将显示进程abcd的退出状态。

现在,否定仅适用于完整管道的退出状态:

! a | b | c | d ; echo "${PIPESTATUS[@]}"

不允许否定管道的某些部分:

a | ! b | c | d   # Syntax error at "| !"

由于这种方式,管道关联比否定更强(可以说这是关联级别上的!(a | b | c | d)),所以结果为管道成分不受否定的影响,因为否定是在评估管道之后稍后应用的。

关于bash - PIPESTATUS 忽略否定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36446615/

相关文章:

linux - 如何让 bash shell 不执行命令的分号列表的其余部分?

database - Cypher - 如何处理否定?

c - LD_PRELOAD 即使在 unsetenv ("LD_PRELOAD"之后也会影响新的 child )

file - applescript/shell 脚本 - 检查图像

json - 将 JSON 对象传递给 jq 参数

html - MySQL HTML 表中的替代颜色编码导致 shell 脚本

prolog - 为什么双重否定在 Prolog 中不绑定(bind)

java - 正则表达式否定无法正常工作

linux - 获取 -enddate 时 Openssl 输出挂起

python - 从 Bash 文件运行 Python 脚本导致导入错误