Comment Résoudre les Liens Symboliques dans un Script Shell

Travailler avec des liens symboliques (ou symlinks) dans des systèmes de type Unix peut parfois être délicat, surtout lorsque vous souhaitez découvrir le chemin réel auquel un symlink pointe. Si vous rédigez un script shell et devez déterminer le chemin complet d’une cible après avoir résolu tous les symlinks intermédiaires, vous êtes au bon endroit. Dans cet article de blog, nous allons décomposer comment y parvenir de manière efficace.

Comprendre le Problème

Imaginez que vous avez une situation où vous disposez d’un lien symbolique foo qui pointe vers un autre répertoire bar. Lorsque vous exécutez des commandes comme cd foo et pwd, votre shell pourrait ne pas révéler la structure sous-jacente clairement, rendant difficile le dérangement du chemin complet vers la cible.

Par exemple :

ls -ld foo bar
drwxr-xr-x   2 greg  greg  68 Août 11 22:36 bar
lrwxr-xr-x   1 greg  greg   3 Août 11 22:36 foo -> bar

Si vous exécutiez :

cd foo
pwd

La sortie serait simplement /Users/greg/tmp/foo, ce qui ne vous aide pas vraiment si votre objectif est de découvrir le chemin réel vers lequel foo pointe, qui est /Users/greg/tmp/bar.

La Solution

Heureusement, il existe des commandes intégrées qui peuvent vous aider à résoudre les symlinks dans un script shell sans avoir besoin de plonger dans la programmation C. Voici comment procéder :

Utiliser la Commande pwd

La commande pwd -P est utilisée pour imprimer le répertoire de travail actuel, en résolvant tous les symlinks pour fournir le chemin absolu de la cible. Lorsque vous exécutez :

pwd -P

Cela renverra le chemin complet après la résolution de tous les symlinks.

Utiliser getcwd

Une autre façon d’accomplir cela est d’utiliser la fonction getcwd de la bibliothèque unistd.h en C. Cependant, si vous écrivez un script, vous pouvez vous fier aux commandes shell à la place. Il est bon de savoir que getcwd a un comportement similaire à pwd -P.

Construire la Fonction Resolve

Vous pouvez encapsuler ces commandes dans une fonction pour rendre votre travail plus facile. Voici un exemple d’une fonction resolve simple dans un shell Bash :

resolve() {
    # Utiliser le chemin fourni et le résoudre
    local target=$1
    # `readlink -f` suit les symlinks et renvoie le chemin complet
    local full_path=$(readlink -f "$target")
    echo "$full_path"
}

Exemple d’Utilisation

Maintenant, il vous suffit d’appeler la fonction avec :

resolve "foo"

Cela renverra :

/Users/greg/tmp/bar

Ce modèle vous permet d’accéder au chemin complet de tout symlink que vous avez rencontré dans votre environnement de script shell.

Bonus : Résoudre les Chemins des Dossiers Utilisateurs

Si vous souhaitez également résoudre les répertoires de domicile en utilisant la notation tilde (comme ~username), Bash développe automatiquement ces chemins dans un script shell, vous pouvez donc combiner cela avec votre fonction resolve sans problème.

Conclusion

Résoudre des liens symboliques dans des scripts shell ne doit pas être compliqué. En utilisant la commande pwd -P ou en créant une fonction d’aide comme resolve qui utilise readlink, vous pouvez déterminer efficacement le chemin complet vers votre cible. Cette compétence est essentielle pour quiconque travaille dans un environnement de type Unix et rend vos scripts beaucoup plus robustes et informatifs.

N’oubliez pas, bien gérer les symlinks peut vous faire gagner du temps et éviter des confusions lors de la navigation dans les structures de répertoires ou lors de la rédaction de scripts shell complexes.