【问题标题】:Difference between test -h and test -Ltest -h 和 test -L 的区别
【发布时间】:2011-01-01 03:28:24
【问题描述】:

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.

【问题讨论】:

    标签: shell testing ksh symlink


    【解决方案1】:

    似乎它们都出于遗留原因而存在,以便在不同版本的 Unix 之间兼容。您应该可以使用其中任何一个,因为它们的作用完全相同,但请注意,如果您运行的系统不符合最新标准,则可能缺少其中一个。

    两种形式都存在于Single Unix Specification version 3/POSIX 2004 中,没有任何警告:

    -h  路径名
    如果 pathname 解析为存在且是符号链接的文件,则为真。如果 pathname 无法解析,则为 False,或者 如果 pathname 解析为存在但不是符号链接的文件。如果 pathname 的最后一个组件是 符号链接,不遵循该符号链接。
    -L  路径名
    如果 pathname 解析为存在且是符号链接的文件,则为真。如果 pathname 无法解析,则为 False,或者 如果 pathname 解析为存在但不是符号链接的文件。如果 pathname 的最后一个组件是 符号链接,不遵循该符号链接。

    根据 Mac OS X 上的 test(1) 手册页和 FreeBSD(请注意,此警告可能已过时;它是 first appeared in NetBSD in 1996):

    -h file 如果文件存在并且是符号链接则为真。该运算符 保留与以前版本的兼容性 这个程序。不要依赖它的存在;改用 -L 。

    显然,some versions of Solaris test 仅支持-h,并且出于兼容性原因(早在 2003 年)some software has switched to -h,因此-h 实际上可能是您最好的选择。

    【讨论】:

    • Do not rely on its existence; use -L instead 手册页上写了吗
    • 是的,我在回答中直接引用了手册页来指出这一点。
    • 请注意,经过进一步研究,man 页面中的那一行已经很老了,可能已经过时了。
    • 谢谢 Brain,我知道了。我正在使用 -L 来识别符号链接。
    【解决方案2】:

    Fedora 的手册页说

       -h FILE
              FILE exists and is a symbolic link (same as -L)
    

    【讨论】:

      【解决方案3】:

      没有区别,它们完全一样。它们的存在可能是为了在 POSIX 之前统一不同的 test 实现。

      【讨论】:

        【解决方案4】:

        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 是一种传统选项,可能有一天会消失 :-)

        【讨论】:

        • 我很欣赏回答我问题的方式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        • 2012-12-03
        • 2012-02-21
        • 2021-12-04
        • 1970-01-01
        • 2022-11-06
        • 2018-06-22
        相关资源
        最近更新 更多