测试-h和测试-L之间的区别

时间:2010-01-04 05:37:28

标签: shell testing ksh symlink

ksh shell中test -L filenametest -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.

4 个答案:

答案 0 :(得分:18)

文件ksh93bltins/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)