在代码审查

在代码审查

代码审查

有人指出我应该改变这样的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."

相关内容