Vous pouvez être intéressé par realpath(3)
, ou Python os.path.realpath
. Les deux ne sont pas exactement les mêmes; la bibliothèque C d'appel exige l'intermédiaire de chemin de composants existent, tandis que la version de Python ne le fait pas.
$ pwd
/tmp/foo
$ ls -l
total 16
-rw-r--r-- 1 miles wheel 0 Jul 11 21:08 a
lrwxr-xr-x 1 miles wheel 1 Jul 11 20:49 b -> a
lrwxr-xr-x 1 miles wheel 1 Jul 11 20:49 c -> b
$ python -c 'import os,sys;print os.path.realpath(sys.argv[1])' c
/private/tmp/foo/a
Je sais que vous l'avez dit vous préférez quelque chose de plus léger qu'un autre langage de script, mais seulement dans le cas de la compilation d'un fichier binaire est insupportable, vous pouvez utiliser Python et ctypes (disponible sur Mac OS X 10.5) pour encapsuler l'appel de la bibliothèque:
#!/usr/bin/python
import ctypes, sys
libc = ctypes.CDLL('libc.dylib')
libc.realpath.restype = ctypes.c_char_p
libc.__error.restype = ctypes.POINTER(ctypes.c_int)
libc.strerror.restype = ctypes.c_char_p
def realpath(path):
buffer = ctypes.create_string_buffer(1024) # PATH_MAX
if libc.realpath(path, buffer):
return buffer.value
else:
errno = libc.__error().contents.value
raise OSError(errno, "%s: %s" % (libc.strerror(errno), buffer.value))
if __name__ == '__main__':
print realpath(sys.argv[1])
Ironiquement, la version C de ce script devrait être plus courte. :)