2012-04-05 6 views

Antwort

3

Die Datei wird nicht wirklich von der Festplatte gelöscht, bis psql beendet ist. Es wird aus dem Verzeichnis gelöscht, so dass es nicht erscheint, aber die Datei bleibt auf der Festplatte (mit Speicherplatz), bis der Vorgang abgeschlossen ist.

+0

Woher wissen Sie, dass der Befehl psql den Dateizugriff auf myfile.sql geöffnet hat, bevor rm die Verknüpfung trennt? –

+1

@ user1131467: Weil die Shell die I/O-Umleitung abgeschlossen haben muss, bevor sie den 'psql'-Prozess in den Hintergrund stellen kann. –

1

In Linux (und den meisten Unix-Varianten) löscht das Betriebssystem durch Löschen einer Datei, die ein Prozess derzeit geöffnet hat, den Verzeichniseintrag, behält aber die Datei selbst auf dem Datenträger, bis der letzte Prozess, der die Datei geöffnet hat, ihn schließt Prozesse, die die Datei verwenden, können glücklich arbeiten, als ob nichts passiert wäre.

Also (1) Ihr Skript funktioniert durch glücklichen Zufall (die Shell entfernt auch nicht die Datei, bis es die Umleitung eingerichtet hat), und (2) versucht, die Datei zu entfernen, bevor psql hat die Verwendung erreicht, erreicht wenig, Da die Datei immer noch Speicherplatz belegt, bis psql beendet ist.

Was meinen Sie wahrscheinlich zu tun ist:

(psql mydatabase < myfile.sql && rm myfile.sql) & 

dies wie Spawns eine Subshell im Hintergrund, die den psql-Befehl ausgeführt wird und nachdem esmyfile.sql entfernen zurück.

Die && bedeutet "führen Sie die linke Seite, und nur wenn es erfolgreich ist (lesen: Rückkehr Status 0) auf der rechten Seite". Dies ist ein übliches Shell-Idiom.

Verwandte Themen