AFAIK, non, vous ne pouvez pas. Vous devez le supprimer et le recréer. En fait, vous pouvez écraser un lien symbolique et ainsi mettre à jour le chemin référencé par celui-ci:
$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile
EDIT : Comme l'OP l'a souligné dans un commentaire, l'utilisation de l' --force
option fera ln
effectuer un appel système à unlink()
avant symlink()
. Ci-dessous, la sortie de strace
sur ma boîte Linux le prouvant:
$ strace -o /tmp/output.txt ln -s -f .bash_aliases test
$ grep -C3 ^unlink /tmp/output.txt
lstat64("test", {st_mode=S_IFLNK|0777, st_size=7, ...}) = 0
stat64(".bash_aliases", {st_mode=S_IFREG|0644, st_size=2043, ...}) = 0
symlink(".bash_aliases", "test") = -1 EEXIST (File exists)
unlink("test") = 0
symlink(".bash_aliases", "test") = 0
close(0) = 0
close(1) = 0
Donc je suppose que la réponse finale est "non".
EDIT : Ce qui suit est copié de la réponse d' Arto Bendiken sur unix.stackexchange.com, vers 2016.
Cela peut en effet être fait de manière atomique rename(2)
, en créant d'abord le nouveau lien symbolique sous un nom temporaire, puis en écrasant proprement l'ancien lien symbolique en une seule fois. Comme l'indique la page de manuel :
Si newpath fait référence à un lien symbolique, le lien sera écrasé.
Dans le shell, vous feriez cela avec mv -T
comme suit:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Vous pouvez strace
cette dernière commande pour vous assurer qu'elle utilise bien rename(2)
sous le capot:
$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z") = 0
Notez que dans ce qui précède, les deux mv -T
et strace
sont spécifiques à Linux.
Sur FreeBSD, utilisez mv -h
alternativement.
Note de l'éditeur: c'est ainsi que Capistrano le fait depuis des années maintenant, depuis ~ 2.15. Voir cette demande d'extraction .
ln
commande (ou l'équiavalent API) écrasant l'ancien lien? Quel problème rencontrez-vous?