我正在创建一个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:如果我从bash运行readlink,它运行得很好:
me@mango:~/dotfiles$ readlink -v ~/.bash_profile
/home/me/dotfiles/.bash_profile发布于 2019-11-11 11:46:20
正如@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"),但这是不可取的,因为它可能会遇到带有特殊字符的文件名。
发布于 2019-11-11 12:04:04
由于周围的引号,~ in "~/$file"正被按字面处理。
在脚本形式中,更好地表示为:
"${HOME}/$file"
${HOME}变量等效于~,将在双引号中展开。
https://unix.stackexchange.com/questions/551532
复制相似问题