Ist es sicher, eine Skriptdatei aus diesem Skript zu entfernen?

9

Stellen Sie sich vor, ich habe ein Skript foo. Es sollte einmal ausgeführt werden, wenn sich der Benutzer anmeldet, und wird nach einer erfolgreichen Ausführung nicht benötigt.

Meine Frage: Ist es sicher, die Skriptdatei aus dem Skript zu entfernen?

Z.B:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0
htorque
quelle
2
Sie können #!/bin/bash -edamit sicherstellen, dass die Skriptdatei nur entfernt wird, wenn nichts schief geht.
sr_
3
Ja, es ist sicher. Wenn Sie wissen möchten, warum, lesen Sie stackoverflow.com/questions/2028874/…
jofel
2
@jofel Hört sich gut an, ich schlage vor, Sie machen dies eine Antwort. :-)
htorque
Im Zweifelsfall können Sie die letzten beiden Zeilen durch ersetzen exec rm /path/to/foo.
Kasperd

Antworten:

5

Es ist sicher, die Shell-Datei während der Ausführung zu entfernen, da Dateihandler nicht vom (erneuten) Verschieben der entsprechenden Datei betroffen sind.

Weitere Informationen finden Sie hier .

Jofel
quelle
2
Seien Sie sich nur bewusst, dass es je nach System möglicherweise nicht funktioniert (dh das rm <it-self>wird unter HP-Ux nicht erfolgreich sein.
Ouki
1
@Ouki, warum? Würde das nicht gegen POSIX verstoßen?
Maxschlepzig
3
@maxschlepzig POSIX ermöglicht das Löschen des letzten Links zu einer ausführbaren Datei, die gerade ausgeführt wird, um fehlzuschlagen: unlinkkann fehlschlagen mit ETXTBUSY. (Seltsamerweise sind "reine Prozedur" und "gemeinsam genutzter Text" in der Spezifikation nicht definiert. AFAIK bedeutet eine Komponente eines ausführbaren Programms: die ausführbare Datei selbst oder eine Bibliothek, die sie verwendet.) Alle wichtigen Unices außer HP-UX ermöglichen das Umbenennen und Aufheben der Verknüpfung von ausführbaren Dateien.
Gilles 'SO - hör auf böse zu sein'
1
@Ouki Das sollte einfach zu umgehen sein, indem man das Skript einfach mit beendet exec rm /path/to/foo.
Kasperd
1

Ich war immer nervös, also tat ich:

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

Alternativ können Sie ein temporäres Skript verketten:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme
Michael Dillon
quelle
In beiden von Ihnen vorgeschlagenen Ansätzen gibt es immer noch einen Shell-Prozess, der die Ausführung des Skripts zum Zeitpunkt des Löschens noch nicht abgeschlossen hat.
Kasperd