Dans un script Bash, je sais que je peux vérifier si un fichier est un lien symbolique avec la syntaxe suivante
if [ -L $path ]
Est-ce que quelqu'un sache comment je voudrais tester si ce chemin était lié à un chemin particulier? Par exemple. Je veux vérifier si la cible de $path
est /some/where
.
Si vous voulez vérifier si $path
est un lien symbolique dont la cible est /some/where
, vous pouvez utiliser l'utilitaire readlink
. Ce n'est pas POSIX, mais il est disponible sur de nombreux systèmes (GNU/Linux, Busybox, * BSD, ...).
if [ "$(readlink -- "$path")" = /some/where ]; then …
Notez qu'il s'agit d'une comparaison de texte exacte. Si la cible du lien est /some//where
, ou si c'est where
et la valeur de $path
est /some/link
, alors les textes ne correspondent pas.
De nombreuses versions de readlink
prennent en charge l'option -f
, qui canonicalise le chemin en développant tous les liens symboliques.
Beaucoup de coquilles, y compris Dash, Ksh, Bash et Zsh, soutiennent le -ef
Opérateur dans le test
_ intégré pour tester si deux fichiers sont les mêmes (liens durs vers le même fichier, après avoir suivi les liens symboliques). Cette fonctionnalité est également largement supportée mais pas POSIX.
if [ "$path" -ef "/some/where" ]; then …
Pour éviter les problèmes avec un chemin relatif et absolu, et "/" à la fin d'un chemin ou d'une liaison:
if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
echo "Is"
else
echo "Is not"
fi