我正在创建一个 bash 函数,如果指定的符号链接引用指定的目标,该函数应该返回 true/false。我根据自己https://unix.stackexchange.com/a/192341/40237
然而,我在readlink
按照自己的意愿去工作时遇到了困难:
is_symlink_to () {
# $1 = symlink / $2 = symlink target
echo "arg1: $1 and arg2: $2"
echo readlink arg 1 is: $(readlink -v $1 ) # -v for troubleshooting
if [ "$(readlink -- $1)" = $2 ]; then
echo "$1 is a symlink to $2"
return 0;
else
return 1;
fi
}
...
if is_symlink_to "~/$file" "$dir/$file" ; then
echo "is already symlinked"
else
...
fi
问题: 为何readlink -v
返回No such file or directory
?
arg1: ~/.bash_profile and arg2: /home/me/dotfiles/.bash_profile
readlink: '~/.bash_profile': No such file or directory
readlink arg 1 is:
如果我readlink
从 bash shell 运行,它工作正常:
me@mango:~/dotfiles$ readlink -v ~/.bash_profile
/home/me/dotfiles/.bash_profile
答案1
正如@UmairKhan 所指出的,波形符扩展在双引号内不起作用,因此该语句
if is_symlink_to "~/$file" "$dir/$file" ; then
.bash_profile
会在目录中查找文件(在您的示例中)字面上地~
在当前目录中命名,而不是在主目录中命名。
如果您仅将实际的“bash 变量部分”括在括号中,那么它应该可以工作,如下所示
if is_symlink_to ~/"$file" "$dir/$file"; then
尽管完全省略第一个参数周围的双括号也可以 ( is_symlink_to ~/$file "$dir/$file"
) ,但这是不可取的,因为它可能会偶然发现带有特殊字符的文件名。
答案2
由于周围的引号,~
in被按字面意思处理。"~/$file"
在脚本形式中,这可以更好地表示为:
"${HOME}/$file"
该${HOME}
变量相当于~
并且将在双引号内扩展。