根据手册页:
-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 版本之间的一些细微差别?还有什么?
没有任何区别。 两个选项的 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)