2009-09-06 14 views
18

Me gustaría cambiar el destino del enlace simbólico dentro de un script bash. El problema es que el enlace simbólico es muy importante (es /bin/sh, a saber) y me gustaría hacerlo de manera que:Reemplazar el enlace simbólico importante 'con seguridad'

  1. Nuevo objetivo estará disponible inmediatamente después de la eliminación de edad, es decir, no habrá posibilidad de que algo va a Observe la desaparición de la misma,
  2. No habrá posibilidad de que el cambio falle en el medio, es decir, que se elimine al usuario con el enlace simbólico y no a uno nuevo.

Pensé en dos métodos. Ya sea usando llanura ln:

ln -fs /bin/bash /bin/sh 

o el uso de mv:

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

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

Respuesta

22

Renombrar (mv) es una operación atómica; crear un nuevo enlace simbólico no es (eliminar el enlace simbólico antiguo, crear uno nuevo). Por lo que debe utilizar mv:

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

Aquí hay una discusión de este blog post. Además, si está preocupado por lo que sucederá, ¿por qué no probar primero un enlace simbólico no crítico?

+1

No puede estar seguro de que no habrá problemas potenciales si lo intenta :). Es muy difícil hacer una prueba para "algo aviso desapareciendo ". – Eugene

+1

Acerca de la publicación del blog - '-T' no parece ser una opción portátil. –

-1

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

Sin embargo, recomiendo encarecidamente contra que une /bin/sh con bash. Muchos scripts usan:

#!/bin/sh 

y se escriben suponiendo que el shell es el clásico shell de Bourne. Si esto fuera a ejecutar bash en su lugar, podría obtener fácilmente incompatibilidades oscuras entre lo que asume el script sh y lo que bashrealmente hace. Estos serán casi imposibles de rastrear.

+5

Excepto por supuesto por el hecho de que en muchos sistemas,/bin/sh * es * un enlace simbólico a/bin/bash; y cuando se invoca a través de él, bash ingresará al modo de compatibilidad sh. –

+0

bash no puede ser compatible sh. Pruebe esto de una manera real y en bash: i = 0; ls | while read a; do i = expr $ i + 1; hecho ; echo $ i Si lo hace no tiene un real sh, intente con ksh Tenga en cuenta que el resultado anterior incluso difiere entre las versiones sh. En Solaris, el extremadamente antiguo sh imprime 0, mientras que la versión xpg4 da un valor distinto de cero (como ksh) – Gunstick

+1

@Gun: entonces, razonas porque "sh" no puede ser compatible con "sh" (es lo que estás diciendo). .. sí, claro, entonces nada, incluido bash, puede ser compatible con todo el comportamiento indefinido de las viejas "sh" s.Lo que bash * puede * ser, sin embargo, es ser compatible con algún sh-estándar comúnmente asumido/aceptado/definido. Me viene a la mente POSIX o SUSv2. –

Cuestiones relacionadas