Bash 如何检查符号链接目标是否与特定路径匹配?
我正在创建一个bash脚本来检查符号链接目标是否与特定路径匹配,因此,如果不匹配,脚本将删除符号链接。我尝试了Bash 如何检查符号链接目标是否与特定路径匹配?,bash,shell,if-statement,symlink,Bash,Shell,If Statement,Symlink,我正在创建一个bash脚本来检查符号链接目标是否与特定路径匹配,因此,如果不匹配,脚本将删除符号链接。我尝试了readlink: #!/bin/env bash target_path=$HOME/Code/slate/.slate.js if [ `readlink $HOME/.slate.js` == "$target_path" ]; then rm -rf "$HOME/.slate.js" fi 但它不起作用: %source test test:5: = not fo
readlink
:
#!/bin/env bash
target_path=$HOME/Code/slate/.slate.js
if [ `readlink $HOME/.slate.js` == "$target_path" ]; then
rm -rf "$HOME/.slate.js"
fi
但它不起作用:
%source test
test:5: = not found
比较字符串时应使用双引号,如下所示(是的,
readlink$HOME/.slate.js
的输出是一个字符串):
如果
$target\u path
与链接文本不完全匹配,您可以检查它们实际上是否相等(无论名称如何)。但由于硬链接更可取,您可能也希望检查这种情况(见下文)
更通用的解决方案是:
[ "$(readlink $HOME/.slate.js)" -ef "$target_path" ]
或者,如您的示例所示:
target_path=$HOME/Code/slate/.slate.js
if [ "`readlink $HOME/.slate.js`" -ef "$target_path" ]; then
rm -rf "$HOME/.slate.js"
fi
但所有这些都假设您的$HOME/.slate.js
是一个符号链接。如果是硬链接(如果可能,最好是硬链接),则更简单:
… [ "$HOME/.slate.js" -ef "$target_path" ] …
可能类似于(检查是否为符号链接,如果是,则检查链接是否与目标匹配;否则检查文件是否为硬链接或实际上是同一文件):
您还应该检查该文件实际上是否是同一个文件(而不是硬链接),否则您将删除该文件的唯一副本 readlink$HOME/.slate.js可能返回的路径与$target\u路径不完全相同,它可能返回类似于Code/slate/.slate.js的内容,而$target\u路径与$target\u路径不同,
$HOME
中是否有空格,可能?回送这两个路径以检查它们是否相等test
对于shell脚本来说可能不是一个好名字,由于它在/bin
(或/usr/bin
)中已经是一个内置的shell和二进制文件。。。
… [ "$HOME/.slate.js" -ef "$target_path" ] …
… [ \( -L "$HOME/.slate.js" -a "`readlink $HOME/.slate.js`" -ef "$target_path" \) \
-o \( "$HOME/.slate.js" -ef "$target_path" \) ] …