J'essaie de vérifier si un lien symbolique existe dans bash. Voici ce que j'ai essayé.
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
Cependant, cela ne fonctionne pas. Si '!' est laissé de côté, il ne déclenche jamais. Et si '!' est là, il se déclenche à chaque fois.
-L
renvoie true si le "fichier" existe et constitue un lien symbolique (le fichier lié peut exister ou non). Vous voulez -f
(retourne vrai si le fichier existe et est un fichier normal) ou peut-être juste -e
(retourne vrai si le fichier existe quel que soit le type).
Selon la page de manuel GN , -h
est identique à -L
, mais selon la page de manuel BSD , il ne doit pas être utilisé:
-h file
True si le fichier existe et qu'il s'agit d'un lien symbolique. Cet opérateur est conservé pour des raisons de compatibilité avec les versions précédentes de ce programme. Ne comptez pas sur son existence; utilisez -L à la place.
-L est le test pour le fichier existe et est aussi un lien symbolique
Si vous ne voulez pas tester le fichier comme étant un lien symbolique, mais juste pour voir s'il existe quel que soit son type (fichier, répertoire, socket, etc.), utilisez -e.
Donc, si le fichier est vraiment un fichier et pas seulement un lien symbolique, vous pouvez effectuer tous ces tests et obtenir un statut de sortie dont la valeur indique la condition d'erreur.
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
Vous pouvez vérifier l'existence d'un lien symbolique et qu'il n'est pas rompu avec:
[ -L ${my_link} ] && [ -e ${my_link} ]
La solution complète est donc:
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
Peut-être que c'est ce que vous recherchez. Pour vérifier si un fichier existe et n'est pas un lien.
Essayez cette commande:
file="/usr/mda"
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink"
Que diriez-vous d'utiliser 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
Le fichier est-il vraiment un lien symbolique? Sinon, le test d’existence habituel est -r
ou -e
.
Voir man test
.
d'abord, vous pouvez faire avec ce style:
mda="/usr/mda"
if [ ! -L "${mda}" ]; then
echo "=> File doesn't exist"
fi
si vous voulez le faire dans un style plus avancé, vous pouvez l'écrire comme ci-dessous:
#!/bin/bash
mda="$1"
if [ -e "$1" ]; then
if [ ! -L "$1" ]
then
echo "you entry is not symlink"
else
echo "your entry is symlink"
fi
else
echo "=> File doesn't exist"
fi
le résultat ci-dessus est comme:
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
Si vous testez l'existence d'un fichier, vous voulez -e not -L. -L recherche un lien symbolique.