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.
Woher wissen Sie, dass der Befehl psql den Dateizugriff auf myfile.sql geöffnet hat, bevor rm die Verknüpfung trennt? –
@ user1131467: Weil die Shell die I/O-Umleitung abgeschlossen haben muss, bevor sie den 'psql'-Prozess in den Hintergrund stellen kann. –