Как проверить, существует ли символическая ссылка
Я пытаюсь проверить, существует ли симлинк на 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
однако, это не сработает.
Если бы! и это никогда не срабатывает. И если бы!- есть, он срабатывает каждый раз.
8 ответов:
-Lвозвращает true, если файл существует "" и является символической ссылкой (связанный файл может и не существовать). Ты хочешь-f(возвращает true, если файл существует и является обычным файлом) или просто-e(возвращает true, если файл существует независимо от типа).по словам GNU manpage,
-hидентичен-L, но по BSD manpage, он не должен использоваться:
-h filetrue, если файл существует и это символическая связь. Этот оператор сохранен для совместимости с предыдущими версиями этой программы. Не полагайтесь на его существование; используйте-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.
сначала вы можете сделать в таком стиле:
mda="/usr/mda" if [ ! -L "${mda}" ]; then echo "=> File doesn't exist" fiесли вы хотите сделать это в более продвинутый стиль вы можете написать его как показано ниже:
#!/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