cómo actualizar un destino de enlace simbólico (ln -f -s no funciona)

cómo actualizar un destino de enlace simbólico (ln -f -s no funciona)

Estoy usando

ln -f -s /var/www/html/releases/build1390 aplicación-actual

para actualizar el enlace simbólico "app-current" con un nuevo destino. Sin embargo, esto no funciona, el enlace "aplicación actual" mantiene su destino original, sin embargo, no aparece ningún error...

Prefiero no eliminar el enlace y volver a crearlo, simplemente actualizar el destino de un enlace existente. ¿Es eso posible?

Respuesta1

Eso funciona para mí, ¿cuál es el resultado strace ln -f -s /var/www/html/releases/build1390 app-current?

Oh, dado que es un directorio que debes agregar -npara no desreferenciarlo y esto debería resolver el problema. -fEs realmente más conveniente ya que agregar -f solo hace que se desvincule de todos modos. Aunque supongo que probablemente sucedería unos cientos de ms más rápido en un sistema con carga normal.

Por ejemplo, si arf ya apunta a /home:

traza con -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

traza Sin -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Entonces, sin -narf se elimina la referencia, por lo que In lo trata como arf como si realmente lo fuera /. En su ejemplo particular, si no hay ningún error, creo que probablemente haya creado un nuevo enlace simbólico dentro /var/www/html/releases/build1390 app-currenty querrá limpiarlo.

Respuesta2

Puede utilizar -no --no-dereferencepara evitar que se elimine la referencia al destino si es un enlace simbólico. También puede utilizar -To --no-target-directorypara asegurarse de que el archivo de destinosiempreser tratado como un archivo normal.

Estos producen un comportamiento ligeramente diferente, como muestra el siguiente ejemplo. Supongamos srcque es algún archivo, dirlinkes un enlace simbólico a un directorio y dires un directorio real.

Usando -n:

  • ln -sfn src dirlinklo sobrescribe dirlinky lo vincula asrc
  • ln -sfn src dircrea enlacedir/src -> src

Usando -T:

  • ln -sfT src dirlinklo sobrescribe dirlinky lo vincula asrc
  • ln -sfT src dirproduce un mensaje de error:ln: ‘dir’: cannot overwrite directory

información relacionada