suave soporta sistema sirve simbólicos simbolico remover que permiten para link fuertes enlaces enlace duro directorios carpetas archivos bash symlink

bash - soporta - no se permiten enlaces fuertes para directorios



Reemplace el enlace simbólico importante ''con seguridad'' (2)

Me gustaría cambiar el destino del enlace simbólico desde un script de bash. El problema es que el enlace simbólico es bastante importante (es /bin/sh , a saber) y lo haría de manera que:

  1. El nuevo objetivo estará disponible inmediatamente después de eliminar el antiguo, es decir, no habrá posibilidad de que algo note su desaparición.
  2. No habrá posibilidad de que el cambio falle en el medio, es decir, dejar al usuario con el enlace simbólico eliminado y sin uno nuevo.

Pensé en dos métodos. Ya sea utilizando ln :

ln -fs /bin/bash /bin/sh

o utilizando mv :

ln -s /bin/bash /bin/sh.new mv /bin/sh.new /bin/sh

¿Cuál se adapta mejor a mis necesidades? ¿Hay alguna posibilidad de que uno de ellos intente reemplazar el objetivo del enlace simbólico en lugar del mismo?


El cambio de nombre ( mv ) es una operación atómica; crear un nuevo enlace simbólico no es (eliminar el enlace simbólico antiguo; crear uno nuevo). Así que deberías usar mv :

$ ln -s new current_tmp && mv -Tf current_tmp current

Aquí hay una publicación de blog discutiendo esto. Además, si está preocupado por lo que sucederá, ¿por qué no lo prueba primero en un enlace simbólico no crítico?


Parece que (desde la página de manual) ln -f desvincula el enlace simbólico antes de crear el nuevo, lo que significa que mv es la mejor opción para esto.

Sin embargo, recomiendo encarecidamente que no se vincule /bin/sh a bash . Muchos scripts usan:

#!/bin/sh

y se escriben suponiendo que la concha es la concha clásica de Bourne. Si esto fuera a ejecutar bash , podría fácilmente obtener incompatibilidades oscuras entre lo que el script supone que sh hace y lo que bash realmente hace. Estos serán casi imposibles de localizar.