15

ksh shelltest -L filename和in有什么区别。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.
4

4 回答 4

22

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是一个遗留选项,可能有一天会消失:-)

于 2010-01-04T06:37:01.367 回答
10

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

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

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

根据Mac OS X 和FreeBSDtest(1)上的手册页(请注意,此警告可能已过时;它于 1996 年首次出现在 NetBSD 中):

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

显然,某些版本的 Solaristest仅支持-h,并且(早在 2003 年)出于兼容性原因,某些软件已切换到-h-h,因此实际上可能是您最好的选择。

于 2010-01-04T05:41:44.130 回答
2

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

于 2010-01-04T05:42:41.570 回答
1

Fedora 的手册页说

   -h FILE
          FILE exists and is a symbolic link (same as -L)
于 2010-01-04T05:42:10.090 回答