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



Я пытаюсь проверить, существует ли симлинк на 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


однако, это не сработает.
Если бы! и это никогда не срабатывает. И если бы!- есть, он срабатывает каждый раз.

882   8  

8 ответов:

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

по словам GNU manpage,-h идентичен -L, но по BSD manpage, он не должен использоваться:

-h file true, если файл существует и это символическая связь. Этот оператор сохранен для совместимости с предыдущими версиями этой программы. Не полагайтесь на его существование; используйте-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 "")";
}

FILE=/usr/mda

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

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

посмотреть man test.

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

  1. сначала вы можете сделать в таком стиле:

    mda="/usr/mda"
    if [ ! -L "${mda}" ]; then
      echo "=> File doesn't exist"
    fi
    
  2. если вы хотите сделать это в более продвинутый стиль вы можете написать его как показано ниже:

    #!/bin/bash
    mda=""
    if [ -e "" ]; then
        if [ ! -L "" ]
        then
            echo "you entry is not symlink"
        else
            echo "your entry is symlink"
        fi
    else
      echo "=> File doesn't exist"
    fi
    

результат выше, как:

root@linux:~# ./sym.sh /etc/passwd
you entry is not symlink
root@linux:~# ./sym.sh /usr/mda 
your entry is symlink
root@linux:~# ./sym.sh 
=> File doesn't exist

Comments

    Ничего не найдено.