ksh shell中test -L filename
和test -h filename
之间的区别是什么?从手册页中,两者都用于标识符号链接,但我想知道确切的区别。
以下是手册页中的说明。
-h file True if file exists and is a sym-
bolic link.
-L file True if file exists and is a sym-
bolic link.
答案 0 :(得分:18)
文件ksh93
中bltins/test.c
的源代码显示,除了作者对未来的希望之外,这两个选项的处理方式完全相同:
case 'L':
case 'h': /* undocumented, and hopefully will disappear */
if(*arg==0 || arg[strlen(arg)-1]=='/' || lstat(arg,&statb)<0)
return(0);
return(S_ISLNK(statb.st_mode));
由此我得出结论,他们的行为完全相同,但-h
是遗留选项,有一天可能会消失: - )
答案 1 :(得分:9)
它们似乎都是出于遗留原因而存在,以便在不同版本的Unix之间兼容。您应该能够使用其中任何一个,因为它们完全相同,但请注意,如果您运行的系统不符合最新标准,则可能缺少其中一个。
这两种形式都出现在Single Unix Specification version 3/POSIX 2004中,没有任何警告:
-h 路径名 如果 pathname 解析为存在且是符号链接的文件,则为True。如果 pathname 无法解析,则返回false,或者 if pathname 解析为存在但不是符号链接的文件。如果 pathname 的最后一个组件是a 符号链接,不遵循符号链接。 -L 路径名 如果 pathname 解析为存在且是符号链接的文件,则为True。如果 pathname 无法解析,则返回false,或者 if pathname 解析为存在但不是符号链接的文件。如果 pathname 的最后一个组件是a 符号链接,不遵循符号链接。
根据Mac OS X上的test(1)
手册页和FreeBSD(请注意,此警告可能已过时; first appeared in NetBSD in 1996):
-h file True if file exists and is a symbolic link. This operator is retained for compatibility with previous versions of this program. Do not rely on its existence; use -L instead.
显然,some versions of Solaris test
仅支持-h
和(早在2003年)some software has switched to -h
出于兼容性原因,因此-h
实际上可能是您最好的选择。
答案 2 :(得分:2)
没有区别,它们完全相同。它们可能存在于统一POSIX之前的不同测试实现。
答案 3 :(得分:1)
Fedora的手册页说
-h FILE
FILE exists and is a symbolic link (same as -L)