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

16

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 sait comment je testerais si ce chemin était lié à un chemin particulier? Par exemple, je veux vérifier si la cible $pathest /some/where.

BillMan
la source
2
Voulez - vous dire lié à par un chemin particulier? Ne pourriez-vous pas faire un readlinkchemin sur le chemin connu et le comparer avec le chemin que vous testez?
Bratchley
@Bratchley. Oui, c'est ce que je voulais dire .. merci pour la réponse.
BillMan
2
Je vous exhorte fortement à toujours mettre des variables shell entre guillemets (par exemple, if [ -L "$path" ]) sauf si vous avez une bonne raison de ne pas le faire et que vous êtes sûr de savoir ce que vous faites.
G-Man dit `` Réintègre Monica ''
@ G-Man merci pour les bons commentaires .. inconsciemment, je sais faire ça, mais oubliez-le dans la pratique .. le renforcement aide.
BillMan

Réponses:

22

Si vous souhaitez vérifier s'il $paths'agit d'un lien symbolique dont la cible est /some/where, vous pouvez utiliser l' readlinkutilitaire. 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 elle est whereet que la valeur de $pathest /some/link, alors les textes ne correspondront pas.

De nombreuses versions de readlinkprennent en charge l'option -f, qui canonise le chemin en développant tous les liens symboliques.

De nombreux shells, notamment dash, ksh, bash et zsh, prennent en charge l' -efopérateur dans le testmodule intégré pour tester si deux fichiers sont identiques (liens physiques vers le même fichier, après avoir suivi les liens symboliques). Cette fonctionnalité est également largement prise en charge mais pas POSIX.

if [ "$path" -ef "/some/where" ]; then 
Gilles 'SO- arrête d'être méchant'
la source
le premier exemple ne fonctionne pas lorsque le lien pointe vers un chemin relatif ...
inemanja
1
@inemanja Bien sûr que oui. Mais comme je le dis, c'est une comparaison de texte . Il traite différents chemins vers la même cible que différents. Si vous souhaitez tester si la cible d'un lien symbolique est un fichier particulier , plutôt qu'un chemin particulier , utilisez l'une des méthodes que je décris ci-dessous.
Gilles 'SO- arrête d'être méchant'
0

Pour éviter les problèmes avec un chemin relatif et absolu et "/" à la fin d'un chemin ou d'un lien:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi
inemanja
la source
1
readlinkne semble pas nécessaire, realpathrésoudra automatiquement le lien symbolique.
Dagang