È sicuro rimuovere un file di script all'interno di quello script?


9

Immagina di avere una sceneggiatura foo. Dovrebbe essere eseguito una volta quando l'utente accede e non è necessario dopo una corretta esecuzione.

La mia domanda: è sicuro rimuovere il file di script all'interno dello script?

Per esempio:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0

2
Non del tutto estranei, si potrebbe usare #!/bin/bash -eper assicurarsi che il file di script viene rimosso solo se niente va storto.
sabato

3
Sì, è sicuro. Se volete sapere, perché, leggere stackoverflow.com/questions/2028874/...
Jofel

2
@jofel Sembra buono, ti consiglio di fare una risposta. :-)
htorque,

In caso di dubbio è possibile sostituire le ultime due righe con exec rm /path/to/foo.
Kasperd,

Risposte:


5

È sicuro rimuovere il file shell durante l'esecuzione, poiché i gestori di file non sono interessati dallo (ri) spostamento del file corrispondente.

Per ulteriori informazioni, vedere qui .


2
Basta essere consapevoli del fatto che potrebbe non funzionare, a seconda del sistema in uso (ovvero rm <it-self>che non funzionerà su HP-Ux.
Ouki,

1
@Ouki, perché? Non violerebbe POSIX?
maxschlepzig,

3
@maxschlepzig POSIX consente la cancellazione dell'ultimo collegamento a un eseguibile attualmente in esecuzione non riuscito: unlinkpotrebbe non riuscire ETXTBUSY. (Stranamente, "procedura pura" e "testo condiviso" non sono definiti nelle specifiche; AFAIK significano un componente di un programma eseguibile: l'eseguibile stesso o una libreria che utilizza). Tutti i principali unice diversi da HP-UX consentono di rinominare e scollegare gli eseguibili.
Gilles 'SO- smetti di essere malvagio' il

2
@Ouki Dovrebbe essere facile aggirare semplicemente terminando la sceneggiatura exec rm /path/to/foo.
Kasperd,

0

Sono sempre stato nervoso per questo, quindi ho fatto:

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

In alternativa puoi concatenare uno script temporaneo:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme

1
In entrambi i tuoi approcci suggeriti ci sarà ancora un processo di shell che non ha finito di eseguire lo script al momento della sua eliminazione.
Kasperd,

Quello che vuoi fare èexec rm /path/to/shell/script
osvein il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.