Auf Unix-ähnlichen Betriebssystemen ist das Entfernen einer Datei möglich, wenn sie noch geöffnet ist. Der Dateiname wird nicht mehr existieren, aber die Daten selbst bleiben bestehen, und alle Programme, die ein offenes Handle haben, einschließlich bash, können weiterhin mit diesem Handle lesen (und sogar schreiben). Nur wenn das letzte Programm seinen Handle schließt, wird die Datei wirklich gelöscht.
Also, in gewissem Sinne, ja, kann ein Shell-Skript selbst löschen, aber es wird nicht wirklich gelöscht werden, bis nach der Ausführung des Skripts beendet.
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. So ein Shell-Skript, das
echo line 1
>test.sh
# (8167 random characters)
echo line 4
so der zweite Block von Daten enthält, ist "cho line 4
", auf meinem System, Ausgänge
$ bash test.sh
line 1
test.sh: line 4: e: command not found
weil die e
bereits gelesen wurde, und die Schale gestoßen EOF, wenn versuche den Rest der Zeile zu lesen.
Update: Rici zeigt, dass mit einem anderen Beispiel des Überschreibens der Datei die neu geschriebenen Inhalte verwendet werden. Nacharbeiten, dass:
script="`tr 12 21 <test.sh`"
env echo "$script" >test.sh
echo toggle: 1
Die zweite Zeile absichtlich nicht bash-interne nicht verwendet echo
Befehl, weil das manchmal nicht bash nicht dazu führen, dass das Skript erneut zu lesen, nach den Kommentaren, aber gerade wenn es funktioniert und ist mir nicht unklar. 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.
Haben Sie es versucht? Was geschieht? – elnigno
Haben Sie es versucht? – bnjmn
Ich wette: Die Datei wird ausgeführt, auch wenn sie gelöscht wurde. –