在代码审查
有人指出我应该改变这样的test
结构:
[ ! -f "$1" ] &&
print_error_and_exit "The given argument is not an existing file."
类似的东西,具体来说:
[ ! -e "$1" ] ...
test -e
但除了info test
;之外,我找不到任何关于此的信息。引用相关章节:
16.3.3 File characteristic tests
--------------------------------
‘-e FILE’
True if FILE exists.
16.3.1 File type tests
----------------------
‘-f FILE’
True if FILE exists and is a regular file.
问题
由于我想 100% 理解我在做什么,我可以要求更深入地说明这两种test
命令的差异和用法吗?
答案1
一些“文件”实际上是目录 ( -d
)、FIFO ( -p
)、设备节点 (-b
和-c
) 等。它们存在,但不是常规文件。
答案2
这听起来像是我的评论!
-e
对于非常规文件,使用 进行测试将返回 true:目录、管道、套接字、设备等。
请注意,符号链接是一种特殊情况 -test
通常使用指向的文件,而不是链接本身(除了test -L
,又名test -h
)。
在引用的评论中,您可能希望能够从 FIFO 中读取数据。 (另一方面,从目录中读取肯定行不通)。
后来在评论中,你真的不想要覆盖一个设备(尽管您可能想要写入 FIFO,因此请根据您的需要进行微调)。
答案3
由于您使用测试是为了避免创建名称已存在的目录条目,因此该条目是什么(常规文件、目录、fifo、设备节点或其他)并不重要,只要它已经存在并且无法创建即可(因为该名称已被使用)。
该-f
测试仅检测“常规文件”。检测-e
其他一些类型。
这更接近你的意图:
[ -e "$output_filename" ] &&
print_error_and_exit 6 "Destination file name exists."
但是,它-e
不检测链接。您需要使用此构造:
[ -e "$output_filename" ] || [ -L "$output_filename" ] &&
print_error_and_exit 6 "Destination file name exists."