bash 条件表达式中的“-h”和“-L”有什么区别?

ffl*_*ing 5 shell bash test

根据手册页:

       -h file
              True if file exists and is a symbolic link.
    ...
       -L file
              True if file exists and is a symbolic link.

Run Code Online (Sandbox Code Playgroud)

他们似乎都在说完全相同的事情,但是为什么要使用两个不同的标志呢?是历史兼容的原因吗?bash 版本之间的一些细微差别?还有什么?

Kus*_*nda 6

没有任何区别。 两个选项的 POSIX 描述

如果路径名解析为符号链接的现有目录条目,则为真。如果 pathname 无法解析,或者 pathname 解析为不是符号链接的文件的现有目录条目,则为 False。如果路径名的最后一部分是符号链接,则不遵循该符号链接。

正如您所说,同时拥有两者的原因很可能是为了支持test[实用程序的历史实现所做出的最常见选择。

至于 的test[内置实用程序bash,它们的功能相同,并且一直如此。bash当前 Git 存储库中最旧的可用源对两者具有相同的措辞(版本 2.04,从 1991 年开始)。

在 1991 年的实际实现中,甚至还有一条评论:

    case 'L':           /* Same as -h  */
    case 'h':           /* File is a symbolic link? */
Run Code Online (Sandbox Code Playgroud)

  • @ffledgling POSIX 标准不是发明,而是标准化现有行为。当“test”实用程序标准化时,委员会查看了当时使用的选项等,显然得出的结论是,他们需要同时包含“-h”和“-L”,以免渲染太多现有软件已过时。 (2认同)