我刚刚在 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[@]}"
这将显示进程a
、b
、c
和d
的退出状态。
现在,否定仅适用于完整管道的退出状态:
! 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/