`if [ -a FILE ]` 和 `if [ -e FILE ]` 之间有什么显着区别吗?

der*_*ugo 5 bash files

如果存在某个文件,我只想检查 bash。
此页面上提到了两个选项可用于if

  • [ -a FILE ] - 如果文件存在则为真
  • [ -e FILE ] - 如果文件存在则为真

它们是等效的还是它们之间有什么区别?

Ser*_*nyy 3

-a 有什么作用以及它为何存在?

-a选项与 , 相同-e,并且存在是为了与 Korn Shell 兼容,Bash 从中借用了很多功能。

根据 POSIX 标准,命令描述test链接):

早期的提案使用了 KornShell -a 主运算符(具有相同的含义),但后来将其更改为 -e,因为人们担心人们很可能将 -a 主运算符与 -a 二元运算符混淆。

旁注:二进制表示出现在两个变量之间的标志[ $var1 -a $var2 ],主要表示首先出现在参数列表中,如下所示[ -a $var ]

事实上,Korn Shell(ksh93此处)手册指出:

-一份文件

与下面的-e 相同。这已经过时了。

您引用的 TLDP 文章test中使用的命令使用bashbuilt-in ,但是尽管文档中缺少该选项,但该选项也存在:test/usr/bin/test

$ /usr/bin/test -a /etc/passwd  && echo 1                                   
1
Run Code Online (Sandbox Code Playgroud)

如果功能相同,是否最好使用它?

只要您 100% 确定您的脚本将在 Bash 或 Korn Shell 上使用 - 那么就可以了。但是,如果您力求脚本的可移植性并希望以 Right Way TM编写脚本,则应该使用-e. 标准的 Ubuntu shell,/bin/sh实际上是 Dash - Debian Amquist Shell - 不认为这是有效的选项:

$ dash
$ test -a /etc/passwd
dash: 1: test: -a: unexpected operator
Run Code Online (Sandbox Code Playgroud)

如果您想将脚本移植到其他平台,则使用并-a不能保证安全/usr/bin/test,您应该坚持使用,-e因为它实际上是由 POSIX 标准指定的。