Answers:
看来您只是在加点测试。您不需要同时运行两个测试,这种情况下唯一需要的就是-h
告诉您文件是否为符号链接。
test -h file && echo "is symlink" || echo "is regular file"
该-f
测试仅告诉您对象是否为文件。这将返回0
如果它是一个目录或设备节点或一个符号链接到一个目录,但将返回1
上一个符号链接到一个文件中。
如果还需要知道它是否是文件而不是目录的符号链接,则需要将两个测试的结果与一些逻辑结合起来。
-h
于文件类型的测试,例如符号链接,-p
命名管道等
@Caleb关于使脚本仅测试符号链接是正确的。但是关于原因的部分被遗漏了,我很好奇。如果查看coreutils源代码并跟踪测试的输出,则可以看到运行符号链接测试时,它使用lstat;如果使用-f测试,则它实际调用“ stat”,该符号紧随符号链接:
$ ln -s varnish_config XXX
$ strace -s 2000 test -L XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-L", "XXX"], [/* 47 vars */]) = 0
lstat("XXX", {st_mode=S_IFLNK|0777, st_size=14, ...}) = 0
$ strace -s 2000 test -L varnish_config 2>&1 | grep varnish
execve("/usr/bin/test", ["test", "-L", "varnish_config"], [/* 47 vars */]) = 0
lstat("varnish_config", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0
$ strace -s 2000 test -f XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-f", "XXX"], [/* 47 vars */]) = 0
stat("XXX", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0
在统计手册页中:
stat() stats the file pointed to by path and fills in buf.
lstat() is identical to stat(), except that if path is a symbolic link,
then the link itself is stat-ed, not the file that it refers to.
这意味着-f测试将返回true,只要指定的文件名是指向常规文件或常规文件本身的符号链接即可。
-e
和-f
被认为-e
是用来知道,如果(任何类型)的文件的存在,并且-f
被具体测试,如果该文件存在,是一个普通的文件。看来我误解了什么是“普通文件”是... ...