Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何检查符号链接目标是否与特定路径匹配?_Bash_Shell_If Statement_Symlink - Fatal编程技术网

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

我正在创建一个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 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" \) ] …