为什么readlink说没有这样的文件或目录

为什么readlink说没有这样的文件或目录

我正在创建一个 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}变量相当于~并且将在双引号内扩展。

相关内容