[bash] 심볼릭 링크가 있는지 확인하는 방법

bash에 symlink가 있는지 확인하려고합니다. 여기 내가 시도한 것이 있습니다.

mda=/usr/mda
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi


mda='/usr/mda'
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi

그러나 그것은 작동하지 않습니다. 만약 ‘!’ 빠지지 않으면 트리거되지 않습니다. 그리고 만약 ‘!’ 거기에, 그것은 매번 트리거합니다.



답변

-L“파일”이 존재하고 심볼릭 링크 인 경우 true를 리턴합니다 (링크 된 파일이 존재하거나 존재하지 않을 수 있음). 원하는 -f경우 (파일이 존재하고 일반 파일 인 -e경우 true를 반환 ) 또는 어쩌면 (유형에 관계없이 파일이 존재하는 경우 true를 반환)

받는 따르면 GNU 맨 , -h동일 -L하지만 따른 BSD 맨 이를 사용해서는 안된다 :

-h file 파일이 존재하고 기호 링크 인 경우에 해당됩니다. 이 연산자는이 프로그램의 이전 버전과의 호환성을 위해 유지됩니다. 그 존재에 의존하지 마십시오. 대신 -L을 사용하십시오.


답변

-L이 존재하고있다 파일에 대한 테스트입니다 또한 심볼릭 링크

기호 링크 인 파일을 테스트하지 않고 유형 (파일, 디렉토리, 소켓 등)에 관계없이 파일이 존재하는지 테스트하려면 -e를 사용하십시오.

따라서 파일이 심볼 링크가 아니라 실제로 파일 인 경우 이러한 모든 테스트를 수행하고 값이 오류 조건을 나타내는 종료 상태를 얻을 수 있습니다.

if [ ! \( -e "${file}" \) ]
then
     echo "%ERROR: file ${file} does not exist!" >&2
     exit 1
elif [ ! \( -f "${file}" \) ]
then
     echo "%ERROR: ${file} is not a file!" >&2
     exit 2
elif [ ! \( -r "${file}" \) ]
then
     echo "%ERROR: file ${file} is not readable!" >&2
     exit 3
elif [ ! \( -s "${file}" \) ]
then
     echo "%ERROR: file ${file} is empty!" >&2
     exit 4
fi


답변

심볼릭 링크가 있는지 확인하고 심볼릭 링크가 손상되지 않았는지 확인할 수 있습니다.

[ -L ${my_link} ] && [ -e ${my_link} ]

따라서 완벽한 솔루션은 다음과 같습니다.

if [ -L ${my_link} ] ; then
   if [ -e ${my_link} ] ; then
      echo "Good link"
   else
      echo "Broken link"
   fi
elif [ -e ${my_link} ] ; then
   echo "Not a link"
else
   echo "Missing"
fi


답변

아마도 이것이 당신이 찾고있는 것입니다. 파일이 존재하고 링크가 아닌지 확인합니다.

이 명령을 시도하십시오 :

file="/usr/mda"
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink"


답변

어때요 readlink?

# if symlink, readlink returns not empty string (the symlink target)
# if string is not empty, test exits w/ 0 (normal)
#
# if non symlink, readlink returns empty string
# if string is empty, test exits w/ 1 (error)
simlink? () {
  test "$(readlink "${1}")";
}

FILE=/usr/mda

if simlink? "${FILE}"; then
  echo $FILE is a symlink
else
  echo $FILE is not a symlink
fi


답변

파일이 실제로 심볼릭 링크입니까? 그렇지 않은 경우 일반적인 존재 테스트는 -r또는 -e입니다.

참조하십시오 man test.


답변

파일 존재를 테스트하는 경우 -L이 아닌 -e를 원합니다. -L은 심볼릭 링크를 테스트합니다.