AFAIK, no, no puedes. Tienes que eliminarlo y recrearlo. En realidad, puede sobrescribir un enlace simbólico y así actualizar el nombre de ruta al que hace referencia:
$ 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
EDITAR : Como el OP señaló en un comentario, el uso de la --force
opción hará que se ln
realice una llamada al sistema unlink()
antes symlink()
. A continuación, la salida de strace
mi caja de Linux lo demuestra:
$ 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
Así que supongo que la respuesta final es "no".
EDITAR : Lo siguiente se copia de la respuesta de Arto Bendiken en unix.stackexchange.com, alrededor de 2016.
De hecho, esto se puede hacer atómicamente rename(2)
, primero creando el nuevo enlace simbólico con un nombre temporal y luego sobrescribiendo limpiamente el enlace simbólico anterior de una sola vez. Como dice la página del manual :
Si newpath se refiere a un enlace simbólico, el enlace se sobrescribirá.
En el shell, haría esto de la mv -T
siguiente manera:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Puede strace
usar ese último comando para asegurarse de que realmente se está utilizando rename(2)
debajo del capó:
$ 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
Tenga en cuenta que en lo anterior, ambos mv -T
y strace
son específicos de Linux.
En FreeBSD, use mv -h
alternativamente.
Nota del editor: así es como Capistrano lo ha hecho durante años, desde ~ 2.15. Ver esta solicitud de extracción .
ln
comando (o la API equivalente) sobrescribiendo el enlace anterior? ¿Qué problema estás teniendo?