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' --forceoption fera lneffectuer un appel système à unlink()avant symlink(). Ci-dessous, la sortie de stracesur 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 -Tcomme suit:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Vous pouvez stracecette 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 -Tet stracesont spécifiques à Linux.
Sur FreeBSD, utilisez mv -halternativement.
Note de l'éditeur: c'est ainsi que Capistrano le fait depuis des années maintenant, depuis ~ 2.15. Voir cette demande d'extraction .
lncommande (ou l'équiavalent API) écrasant l'ancien lien? Quel problème rencontrez-vous?