Как проверить, существует ли символическая ссылка

Я пытаюсь проверить, существует ли символическая ссылка в bash. Вот что я пробовал.

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

Однако это не работает. Если '!' Оставшись, он никогда не запускается. И если '!' есть, он запускается каждый раз.

Ответ 1

-L возвращает true, если "файл" существует и является символической ссылкой (связанный файл может существовать или не существовать). Вы хотите -f (возвращает true, если файл существует и является обычным файлом) или, может быть, просто -e (возвращает true, если файл существует независимо от типа).

В соответствии с справочной линией GNU, -h идентичен -L, но в соответствии с BSD manpage, его не следует использовать:

-h file Истина, если файл существует и является символической ссылкой. Этот оператор сохраняется для совместимости с предыдущими версиями этой программы. Не полагайтесь на его существование; вместо этого используйте -L.

Ответ 2

-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

Ответ 3

Возможно, это то, что вы ищете. Проверить, существует ли файл и не является ли ссылка.

Попробуйте выполнить следующую команду:

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

Ответ 4

Вы можете проверить наличие символической ссылки и что она не разбита на:

[ -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

Ответ 5

Является ли файл действительно символической ссылкой? Если нет, обычный тест на существование - -r или -e.

См. man test.

Ответ 6

Как насчет использования 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

Ответ 7

Если вы тестируете существование файла, вы хотите - не -L. -L для символической ссылки.