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