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 代码。
所以,我的问题是:
您是否同意这一点-a并且“本质-o上test是模棱两可的”?
在多种情况下,您使用-a(-o)or吗&&(||)?
有人有争论要明确命名-a和-o“模棱两可”吗?或者这只是作者的观点?他们应该建议我们使用&&而不是-a仅基于他们在手册页中的意见吗?
让我们坚持严格的 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是否不存在。