이 스크립트가 잘못된 심볼릭 링크를 생성하려는 이유를 설명할 수 있는 사람이 있습니까?
주요 문제는 다음 줄에 있습니다.
ln -s ${src}/${lib} ${dest64}/${lib}
다음과 같은 오류가 발생하기 때문입니다.
ln: creating symbolic link `/usr/lib64/libpgtypes.so/libpgtypes.so': File exists
그러나 에코 메시지에 따르면 실제 변수/링크는 다음과 같아야 합니다.
/usr/lib64/libpgtypes.so
다음은 스크립트 실행 결과입니다.
[root@server dir]# sh myscript.sh
Symbolic link already created from /opt/rh/rh-postgresql94/root/usr/lib64/libpgtypes.so to /usr/lib/libpgtypes.so
ln -s /opt/rh/rh-postgresql94/root/usr/lib64/libpgtypes.so /usr/lib64/libpgtypes.so
ln: creating symbolic link `/usr/lib64/libpgtypes.so/libpgtypes.so`: File exists
Created symbolic link from /opt/rh/rh-postgresql94/root/usr/lib64/libpgtypes.so to /usr/lib/libpgtypes.so
스크립트의 코드는 다음과 같습니다: #!/bin/bash
libraries=('libpgtypes.so')
src="/opt/rh/rh-postgresql94/root/usr/lib64"
dest="/usr/lib"
dest64="/usr/lib64"
for lib in ${libraries[*]}; do
if [ -f ${dest}/${lib} ]; then
echo "Symbolic link already created from ${src}/${lib} to ${dest}/${lib}"
else
ln -s ${src}/${lib} ${dest}/${lib}
echo "Created symbolic link from ${src}/${lib} to ${dest}/${lib}"
fi
if [ -f ${dest64}/${lib} ]; then
echo "Symbolic link already create from ${src}/${lib} to ${dest64}/${lib}"
else
echo "ln -s ${src}/${lib} ${dest64}/${lib}"
ln -s ${src}/${lib} ${dest64}/${lib}
echo "Created symbolic link from ${src}/${lib} to ${dest}/${lib}"
fi
done
답변1
/usr/lib64/libpgtypes.so
이것은 시스템의 디렉토리인 것 같습니다 . (이게 맞는지 틀린지는 말씀드릴 수 없습니다.)
그런데 좋은 코딩 습관으로 모든 변수에 큰따옴표를 사용하는 것이 좋습니다.
대신에 ln -s ${src}/${lib} ${dest64}/${lib}
를 작성해야 합니다 . 이렇게 하면 루프를 올바르게 ln -s "${src}/${lib}" "${dest64}/${lib}"
처리할 수도 있습니다 . ( 대신 참고하세요 )for
for lib in "${libraries[@]}"; do ... done
@
*
답변2
-h
dest가 심볼릭 링크인지 확인하는 데 사용됩니다 . 예를 들어 다음을 사용하여 다른 모든 유형을 삭제할 수 있습니다.
if ! [ -h "${dest}/${lib}" ]; then
rm -rf "${dest}/${lib}"
fi
답변3
/usr/lib64/libpgtypes.so
경로에 디렉터리가 있어야 합니다. 오류를 방지하려면 삭제하거나 이름을 변경한 후 스크립트를 다시 실행하세요.