¿Es seguro eliminar un archivo de script de ese script?

9

Imagina que tengo un guión foo. Debe ejecutarse una vez cuando el usuario inicia sesión y no es necesario después de una ejecución exitosa.

Mi pregunta: ¿es seguro eliminar el archivo de script desde el script?

P.ej:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0
htorque
fuente
2
No está completamente relacionado, puede usarlo #!/bin/bash -epara asegurarse de que el archivo de secuencia de comandos se elimine solo si nada sale mal.
Sr_
3
Sí, es seguro Si quieres saber por qué, lee stackoverflow.com/questions/2028874/…
jofel
2
@jofel Suena bien, te sugiero que hagas de esto una respuesta. :-)
htorque
En caso de duda, puede reemplazar las dos últimas líneas con exec rm /path/to/foo.
kasperd

Respuestas:

5

Es seguro eliminar el archivo shell mientras lo ejecuta, ya que los manejadores de archivos no se ven afectados por (re) mover el archivo correspondiente.

Para más información, ver aquí .

jofel
fuente
2
Solo tenga en cuenta que puede no funcionar, dependiendo de su sistema (es decir rm <it-self>, no tendrá éxito en HP-Ux.)
Ouki
1
@Ouki, ¿por qué? ¿No violaría eso POSIX?
maxschlepzig
3
@maxschlepzig POSIX permite la eliminación del último enlace a un ejecutable que se está ejecutando actualmente para fallar: unlinkpuede fallar con ETXTBUSY. (Curiosamente, "procedimiento puro" y "texto compartido" no están definidos en la especificación; AFAIK significan un componente de un programa ejecutable: el propio ejecutable o una biblioteca que usa). Todas las unidades principales que no sean HP-UX permiten renombrar y desvincular ejecutables.
Gilles 'SO- deja de ser malo'
2
@Ouki Eso debería ser fácil de solucionar simplemente terminando el guión con exec rm /path/to/foo.
kasperd
0

Siempre estaba nervioso por esto, así que hice:

(sleep 5; rm /path/to/shell/script) &
exit 0

Alternativamente, puede encadenar a un script temporal:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme
Michael Dillon
fuente
1
En ambos enfoques sugeridos, seguirá habiendo un proceso de shell que no ha terminado de ejecutar el script para cuando se elimine.
kasperd
Lo que quieres hacer esexec rm /path/to/shell/script
osvein