指定されたシンボリックリンクが指定されたターゲットを参照している場合は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"
ファイル名に特殊文字が含まれる可能性があるため、お勧めしません。