237 votes

Comment faire pour résoudre des liens symboliques dans un script shell

Étant donné un chemin relatif ou absolu (dans un système de type Unix), je tiens à déterminer le chemin d'accès complet de la cible après la résolution de tout intermédiaire des liens symboliques. Des points Bonus pour les aussi la résolution de ~nom d'utilisateur de la notation dans le même temps.

Si la cible est un répertoire, il pourrait être possible de chdir() dans le répertoire, puis appeler getcwd(), mais j'ai vraiment envie de le faire à partir d'un script shell plutôt que d'écrire une C helper. Malheureusement, les coquillages ont tendance à essayer de cacher l'existence de liens symboliques de l'utilisateur (c'est bash sur OS X):

$ ls -ld foo bar
drwxr-xr-x   2 greg  greg  68 Aug 11 22:36 bar
lrwxr-xr-x   1 greg  greg   3 Aug 11 22:36 foo -> bar
$ cd foo
$ pwd
/Users/greg/tmp/foo
$

Ce que je veux, c'est une fonction de résoudre() de telle sorte que lorsqu'il est exécuté à partir du répertoire tmp dans l'exemple ci-dessus, résoudre("foo") == "/Users/greg/tmp/bar".

432voto

pixelbeat Points 12073
readlink -f $path

Remarque depuis GNU coreutils 8.15 (2012-01-06), il y a une fonction realpath programme disponible qui est moins obtus et plus souple que le précédent. Il est également compatible avec FreeBSD util du même nom. Il comprend également des fonctionnalités pour générer un chemin relatif entre les deux fichiers.

realpath $path

[Admin outre-dessous de commentaire par halloleo -danorton]

Pour Mac OS X (par le biais d'au moins 10.8.x), utilisez readlink sans -f option:

readlink $path

98voto

kauppi Points 6529

Selon les normes, pwd -P doit retourner le chemin d’accès avec les liens symboliques résolu.

C fonction char getcwd (char buf, size_t size) du unistd.h devrait avoir le même comportement.

getcwd PWD

28voto

tlrobinson Points 925

« pwd -P » semble fonctionner si vous voulez juste le répertoire, mais si pour une raison quelconque, vous souhaitez que le nom de l’actuel exécutable je ne pense pas que cela aide. Voici ma solution :

21voto

Gregory Points 707

Un de mes favoris est``

 realpath - retourne le chemin canonique absolu realpath étend tous les symbolique liens et résout les références aux ' /. /', ' /... /' et en sus des caractères « / » dans la chaîne de fin nulle retrouvée : chemin d’accès et stocke le chemin canonique absolu dans la mémoire tampon de taille PATH_MAX retrouvée : resolved_path. Le tracé résultant n’aura aucun lien symbolique, ' /. /' ou ' /... /' composants. 

5voto

Keymon Points 111

Une autre façon :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X