web-dev-qa-db-fra.com

Comment vérifier la cible d'un lien symbolique sur un chemin particulier

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.

16
BillMan

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
0
inemanja