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:
- El nuevo objetivo estará disponible inmediatamente después de eliminar el antiguo, es decir, no habrá posibilidad de que algo note su desaparición.
- 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.