readlinkにそのようなファイルやディレクトリがないと言うのはなぜですか? [重複]

readlinkにそのようなファイルやディレクトリがないと言うのはなぜですか? [重複]

指定されたシンボリックリンクが指定されたターゲットを参照している場合はtrue / falseを返す必要があるbash関数を作成しています。私は自分自身に基づいています。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

ベストアンサー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"ファイル名に特殊文字が含まれる可能性があるため、お勧めしません。

おすすめ記事