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"파일 이름에 특수 문자가 포함될 수 있으므로 권장하지 않습니다.

답변2

주변 따옴표로 인해 ~in은 문자 그대로 처리됩니다."~/$file"

스크립트 형식에서는 다음과 같이 더 잘 표현할 수 있습니다.

"${HOME}/$file"

변수 는 큰따옴표 ${HOME}와 동일 ~하며 큰따옴표 내에서 확장됩니다.

관련 정보