Unter Unix-ähnlichen Betriebssystemen ist das Entfernen einer Datei möglich, wenn sie noch geöffnet ist. Der Dateiname ist nicht mehr vorhanden, aber die Daten selbst bleiben erhalten, und alle Programme mit einem offenen Handle, einschließlich bash, können mit diesem Handle weiter lesen (und sogar schreiben). Erst wenn das letzte Programm den Griff schließt, wird die Datei wirklich gelöscht.
Ja, gewissermaßen kann sich ein Shell-Skript selbst löschen, aber wird erst gelöscht, wenn die Ausführung dieses Skripts beendet ist.
Beachten Sie, dass Sie andere Ergebnisse erhalten, wenn Sie die Datei überschreiben, anstatt sie zu löschen. Shells können (und tun) Pufferung verwenden, um das Lesen von jeweils einem Byte zu vermeiden, aber der Puffer hat eine endliche Größe. Wenn sich der Dateiinhalt über das hinaus ändert, was die Shell bereits in den Speicher gelesen hat, wird der neue Inhalt angezeigt. Sie können ein einfaches Beispiel dafür erstellen, wenn Sie untersuchen, wie groß die Puffergröße für Ihr System ist. Auf meinem System sind es 8 KiB. Also ein Shell-Skript, das
enthält %Vor% Also der zweite Datenblock ist " cho line 4
", auf meinem System, Ausgaben
, weil e
bereits gelesen wurde und die Shell EOF beim Lesen des Rests der Zeile gefunden hat.
Aktualisieren : rici zeigt an, dass die neu geschriebenen Inhalte mit einem anderen Beispiel für das Überschreiben der Datei verwendet werden. Überarbeitung das:
%Vor% Die zweite Zeile verwendet absichtlich nicht den integrierten Befehl echo
von bash, weil dies manchmal nicht dazu führt, dass bash das Skript erneut liest, je nachdem, was genau ist und was unklar ist mir. bash gibt den neu geschriebenen Toggle-Wert aus, wenn die dritte Zeile erreicht wird. Der relevante Unterschied zwischen diesem und meinem früheren Beispiel scheint zu sein, dass bash hier die aktuelle Position suchen kann, wenn es zu Zeile 3 kommt, während dies in meinem früheren Beispiel unmöglich ist, weil diese Position nicht mehr existiert, wie die Datei ist leer.
Ist das eine Neugier, die Sie haben oder was Sie eigentlich erreichen wollen?
Jedenfalls habe ich mir dieses einfache Skript (test_script.sh) ausprobiert:
%Vor% und es druckt Still here!
, so dass die Datei vor der Ausführung geladen wurde.
Die Ausführung ist beim zweiten Mal nicht möglich.
Um Ihre Frage zu beantworten, ja und nein. Die Befehle im Skript werden geladen und ausgeführt und können die Quelldatei des Skripts löschen. Dadurch wird es natürlich unmöglich, die gleiche Datei erneut auszuführen, aber die erste Ausführung wird nicht beeinflusst.
Tags und Links bash