Bash

為什麼說readlink沒有這樣的文件或目錄

  • November 11, 2019

我正在創建一個 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

正如@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") ,但這並不可取,因為它可能會偶然發現帶有特殊字元的文件名。

引用自:https://unix.stackexchange.com/questions/551532