为什么 && 在 bash 中比 -a 更好?

Vik*_*lin 6 linux testing bash shell manpage

我读过man test并发现:

注意:二进制 -a 和 -o 本质上是不明确的。使用“测试 EXPR1 && 测试 EXPR2”或“测试 EXPR1 ||” 改为测试 EXPR2'。

有人可以解释一下-aand中的含糊之处-o吗?

英语不是我的母语。据我了解,Kevin Braunsdorf 和 Matthew Bradburn(本手册页的作者)建议我们使用&&而不是仅仅-a因为-a可以用作另一个二进制文件中的密钥,因为-a可能有不同的可能含义。

所以,与我们使用时-a没有关联。对于某些人来说并不清楚,所以人们会这样想:“嗯,那把钥匙是什么?我不知道,不确定它是什么,我必须访问......”logical ANDtestlogical ANDman

我能找到的唯一原因是,使用 的代码&&比使用 的代码更容易阅读-a(仅是一个示例):

与-a:

if [ -f "${my_var_with_filename}" -a -n "${my_another_array_var_with_filename[2]}" -o -r /just/path/to/file ]
then
...
fi
Run Code Online (Sandbox Code Playgroud)

与 && 相同:

if [ -f "${my_var_with_filename}" ] && [ -n "${my_another_array_var_with_filename[2]}" ] || [ -r /just/path/to/file ]
then
...
fi
Run Code Online (Sandbox Code Playgroud)

对我来说,这两个例子在语法上都很复杂,并且很难阅读具有多个条件、变量、数组变量和逻辑运算符的 bash 代码。

所以,我的问题是:

  1. 您是否同意这一点-a并且“本质-otest是模棱两可的”?

  2. 在多种情况下,您使用-a(-o)or吗&&(||)

  3. 有人有争论要明确命名-a-o“模棱两可”吗?或者这只是作者的观点?他们应该建议我们使用&&而不是-a仅基于他们在手册页中的意见吗?

che*_*ner 5

让我们坚持严格的 POSIX,以及代表逻辑 AND 的扩展-a。现在,考虑命令

test "$1" -a "$2"
Run Code Online (Sandbox Code Playgroud)

您可能认为这将测试 和$1都是$2非空字符串。但你错了。如果$1 == "!",那么你有命令

test ! -a "$2"
Run Code Online (Sandbox Code Playgroud)

由于-a不是受支持的一元运算符,因此失败。

(这是根据 POSIX 规范本身给出的示例改编的。)


如果确实如此bash,情况会变得更糟。-a 一个有效的一元运算符,所以现在您正在测试名为 by 的文件$2是否存在。


小智 -2

  1. 虽然test二进制文件具有 -a 和 -o 标志,但并不常见。即使在测试命令本身中,-a 也是不明确的,因为它既可用于检查文件是否存在,也可用于表示二进制 AND 运算符。

  2. 使用 && 和 || 用于二进制 AND 和二进制 OR。它们作为 C 语言的标准更加常见和形式化。

  3. 请参阅我对你的第一个问题的回答。即使在test命令本身内,-a 也可能不明确;使用 && 和 || 反而。