如何验证符号链接的目标指向特定路径


16

在bash脚本中,我知道我可以使用以下语法检查文件是否为符号链接

if [ -L $path ]

有谁知道我将如何测试该路径是否链接到特定路径?例如,我要检查的目标是否$path/some/where



2
您是说通过特定路径链接吗?您不能readlink在已知路径上进行比较,然后将其与要测试的路径进行比较吗?
布拉奇利

@布拉奇利 是的,这就是我的意思..谢谢您的回答。
BillMan

2
我强烈建议您始终将shell变量放在引号中(例如if [ -L "$path" ]),除非您有充分的理由不这样做,并且您确定自己知道自己在做什么。
G-Man说'

@ G-Man感谢您的宝贵反馈。.我下意识地知道这样做,但是在实践中却忘了它。
BillMan

Answers:


22

如果要检查是否$path是目标为的符号链接,则/some/where可以使用该readlink实用程序。它不是POSIX,但是可以在许多系统上使用(GNU / Linux,BusyBox,* BSD等)。

if [ "$(readlink -- "$path")" = /some/where ]; then 

请注意,这是精确的文本比较。如果链接的目标是/some//where,或者链接的目标是,where并且的值$path/some/link,则文本将不匹配。

许多版本都readlink支持option -f,该选项通过扩展所有符号链接来规范化路径。

许多shell(包括dash,ksh,bash和zsh)都支持内置的-ef运算符test来测试两个文件是否相同(在跟随符号链接之后,硬链接到同一文件)。也广泛支持此功能,但POSIX不支持。

if [ "$path" -ef "/some/where" ]; then 

当链接指向相对路径时,第一个示例不起作用...
inemanja

1
@inemanja当然可以。但是正如我所说,这是文本比较。它将通往同一目标的不同路径视为不同。如果要测试符号链接的目标是否是特定文件而不是特定路径,请使用下面介绍的一种方法。
吉尔斯(Gilles)'所以

0

为避免相对路径和绝对路径以及路径或链接末尾的“ /”问题,请执行以下操作:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi

1
readlink似乎没有必要,realpath将自动解析符号链接。
大港
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.