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。
在我的项目中我使用模式
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。