지정된 심볼릭 링크가 지정된 대상을 참조하는 경우 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}
와 동일 ~
하며 큰따옴표 내에서 확장됩니다.