Kann ein Shell-Skript sich selbst löschen oder überschreiben?

7
%Vor%

und hier ist die Quelldatei:

%Vor%

Wie wird das Bash-Skript gehandhabt? Lädt es zuerst die Quelldatei und löscht sie dann, oder wird die Variable einen Wert im Bash-Skript 1 haben?

    
Paolo 21.12.2013, 18:15
quelle

2 Antworten

16

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

%Vor%

, 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.

    
hvd 21.12.2013, 18:33
quelle
2

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.

    
elnigno 21.12.2013 18:22
quelle

Tags und Links