我只想在 bash 中检查某个文件是否存在
。这一页提到了两个可供使用的选项if
:
[ -a FILE ]
- 如果文件存在则为真[ -e FILE ]
- 如果文件存在则为真
它们是等效的吗或者它们之间有什么区别?
答案1
-a 起什么作用以及它为什么存在?
该-a
选项与 相同-e
,是为了与 Korn Shell 兼容,Bash 从 Korn Shell 中借用了很多功能。
来自 POSIX 标准,命令描述test
(关联):
早期提案使用了 KornShell -a 主运算符(含义相同),但后来将其更改为 -e,因为人们担心人们很容易将 -a 主运算符与 -a 二元运算符混淆。
边注:二进制表示出现在两个变量之间的标志[ $var1 -a $var2 ]
,主要表示首先出现在参数列表中,如[ -a $var ]
事实上,Korn Shell(ksh93
此处)手册指出:
-一份文件
与下面的 -e 相同。此选项已过时。
在test
您引用的 TLDP 文章使用内置的 bash ,但是尽管文档中没有提供test
该选项,但它也存在:/usr/bin/test
$ /usr/bin/test -a /etc/passwd && echo 1
1
如果功能相同,使用它是否好?
只要您 100% 确定您的脚本将在 Bash 或 Korn Shell 上使用 - 那么可以。但是,如果您追求脚本的可移植性并希望以正确的方式编写脚本,则应使用-e
。标准 Ubuntu shell,/bin/sh
实际上是 Dash - Debian Amquist Shell - 不将其识别为有效选项:
$ dash
$ test -a /etc/passwd
dash: 1: test: -a: unexpected operator
如果您想将脚本移植到其他平台,使用也-a
不能保证其安全性/usr/bin/test
,您应该坚持使用,-e
因为它实际上是由 POSIX 标准指定的。