Vaste question qui ne me semble reposer que sur 3 réponses :

  • L'utilisation de stat,
  • L'utilisation de file,
  • L'utilisation de readlink.
Utilisons stat :
fly@Capote:~/tmp$ stat /tmp/totoz
  File: `/tmp/totoz' -> `/tmp/pipo'
  Size: 40        	Blocks: 0          IO Block: 4096   lien symbolique
Device: 808h/2056d	Inode: 3744        Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/     fly)   Gid: ( 1000/     fly)
Access: 2010-05-27 23:42:00.590730266 +0200
Modify: 2010-05-26 23:34:46.978029853 +0200
Change: 2010-05-26 23:34:46.978029853 +0200

On constate que le nom du fichier pointé est indiqué en première ligne. Donc, la ligne suivante devrait suffire :

fly@Capote:~/tmp$ a="$(stat /tmp/totoz | head -1 | awk '{print $NF}')" ; echo ${a}
`/tmp/pipo'

C'est bien mais pas top avec les quotes, d'où l'astuce suivante :

fly@Capote:~/tmp$ i=${#a}; echo ${a:1:(($i-2))}
/tmp/pipo
Utilisons file :
fly@mst:~/tmp$ file /tmp/totoz
/tmp/totoz: symbolic link to `/tmp/pipo'

On constate maintenant qu'une seule ligne est retournée, mais il y a toujours ce problème de quotes. Donc, on résout de la même manière :

fly@mst:~/tmp$ a="$(stat /tmp/totoz | awk '{print $NF}')" ; echo ${a}
`/tmp/pipo'
fly@mst:~/tmp$ i=${#a}; echo ${a:1:(($i-2))}
/tmp/pipo
Utilisons readlink :
fly@Capote:~/tmp$ readlink /tmp/totoz
/tmp/pipo

Bon, ben voilà; finalement je le préfère ce petit readlink (et de loin)...