首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么readlink说没有这样的文件或目录?

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

Unix & Linux用户
提问于 2019-11-11 09:59:13
回答 2查看 1.8K关注 0票数 -1

我正在创建一个bash函数,如果指定的符号链接引用指定的目标,它应该返回true/false。我以https://unix.stackexchange.com/a/192341/40237为基础

但是,我很难让readlink按我的意愿工作:

代码语言:javascript
复制
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

代码语言:javascript
复制
arg1: ~/.bash_profile and arg2: /home/me/dotfiles/.bash_profile
readlink: '~/.bash_profile': No such file or directory
readlink arg 1 is:

如果我从bash运行readlink,它运行得很好:

代码语言:javascript
复制
me@mango:~/dotfiles$ readlink -v ~/.bash_profile
/home/me/dotfiles/.bash_profile
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-11-11 11:46:20

正如@UmairKhan所指出的,倾斜展开在双引号中不起作用,所以下面的语句

代码语言:javascript
复制
if is_symlink_to "~/$file" "$dir/$file" ; then

将在当前目录中的一个名为.bash_profile的目录中查找一个文件(在您的示例中),而不是在您的主目录中。

如果您只将实际的"bash变量部分“括在括号中,它就会工作,如

代码语言:javascript
复制
if is_symlink_to ~/"$file" "$dir/$file"; then

虽然完全省略第一个参数周围的双括号也是有效的(is_symlink_to ~/$file "$dir/$file"),但这是不可取的,因为它可能会遇到带有特殊字符的文件名。

票数 1
EN

Unix & Linux用户

发布于 2019-11-11 12:04:04

由于周围的引号,~ in "~/$file"正被按字面处理。

在脚本形式中,更好地表示为:

"${HOME}/$file"

${HOME}变量等效于~,将在双引号中展开。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/551532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档