Est-il sûr de supprimer un fichier de script de ce script?

9

Imaginez que j'ai un script foo. Il doit être exécuté une fois lorsque l'utilisateur se connecte et n'est pas nécessaire après une exécution réussie.

Ma question: est-il sûr de supprimer le fichier de script de l'intérieur du script?

Par exemple:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0
htorque
la source
2
Pas entièrement sans rapport, vous pouvez utiliser #!/bin/bash -epour vous assurer que le fichier de script est supprimé uniquement si rien ne va mal.
sr_
3
Oui, c'est sûr. Si vous voulez savoir pourquoi, lisez stackoverflow.com/questions/2028874/…
jofel
2
@jofel Sonne bien, je vous suggère d'en faire une réponse. :-)
htorque
En cas de doute, vous pouvez remplacer les deux dernières lignes par exec rm /path/to/foo.
kasperd

Réponses:

5

Il est sûr de supprimer le fichier shell lors de son exécution, car les gestionnaires de fichiers ne sont pas affectés par le (re) déplacement du fichier correspondant.

Pour plus d'informations, voir ici .

jofel
la source
2
Sachez simplement que cela peut ne pas fonctionner, en fonction de votre système (c'est-à-dire rm <it-self>qu'il ne réussira pas sur HP-Ux.
Ouki
1
@Ouki, pourquoi? Cela ne violerait-il pas POSIX?
maxschlepzig
3
@maxschlepzig POSIX permet la suppression du dernier lien vers un exécutable en cours d'exécution pour échouer: unlinkpeut échouer avec ETXTBUSY. (Curieusement, «procédure pure» et «texte partagé» ne sont pas définis dans la spécification; AFAIK ils désignent un composant d'un programme exécutable: l'exécutable lui-même ou une bibliothèque qu'il utilise). Toutes les unités principales autres que HP-UX permettent de renommer et de dissocier les exécutables.
Gilles 'SO- arrête d'être méchant'
2
@Ouki Cela devrait être facile à contourner en terminant simplement le script par exec rm /path/to/foo.
kasperd
0

J'étais toujours nerveux à ce sujet, alors j'ai fait:

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

Alternativement, vous pouvez chaîner vers un script temporaire:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme
Michael Dillon
la source
1
Dans les deux approches suggérées, il y aura toujours un processus shell qui n'aura pas fini d'exécuter le script au moment de sa suppression.
kasperd
Ce que vous voulez faire estexec rm /path/to/shell/script
osvein