Bash:-e是否等同于-f || -d?

Bash: Is -e equivalent to -f || -d?

在我的项目中我使用模式

if [ -f "$path" ] || [ -d "$path" ]; then
    echo "$path exists"
fi

检查文件系统中是否存在$path,无论是文件还是目录。这 完全 等同于只是做

if [ -e "$path" ]; then
    echo "$path exists"
fi

?符号链接或设备等特殊文件呢?是否需要注意任何依赖于平台的细节?我使用 Bash,但我想了解 shell 之间的细微差别。

不,不是。 -e pathname 仅测试 pathname 是否解析为现有目录条目。另一方面,-f-d 也分别测试条目是否针对常规文件和目录。

例如,如果pathname解析为FIFO(或块特殊文件,或字符设备,或套接字等),[ -e pathname ] returns true ;但是 [ -f pathname ] || [ -d pathname ] return 是错误的。

至于符号 link,-e-f-d 都没有将它们与它们解析为的条目区分开来。如果 pathname 命名一个普通文件、一个目录,或者一个符号 link 到一个普通文件或目录,那么 [ -e pathname ][ -f pathname ] || [ -d pathname ] return 都为真。如果 pathname 将一个符号 link 命名为一个不存在的条目(即损坏的符号 link),则两者都 return false。