In Linux lässt sich eine Datei nicht innerhalb eines Befehls auf der Konsole lesen und schreiben, auch nicht wenn es mehrere Befehle sind die mittels Pipe oÄ.. verknüpft sind.
Code: Alles auswählen
LINUX> cat test.txt > test.txt
cat: test.txt: Eingabedatei ist Ausgabedatei
selbst wenn es scheinbar mal funktioniert und die Shell es nicht erkennt und die Ausführung zuläßt, ist die Datei anschließend in der Regel leer.
Code: Alles auswählen
LINUX> ls -il test.txt
3017895 -rw-r--r-- 1 robi users 900 3. Okt 22:52 test.txt
LINUX> cat test.txt | cat | cat | cat | cat > test.txt
LINUX> ls -il test.txt
3017895 -rw-r--r-- 1 robi users 0 3. Okt 22:53 test.txt
somit kann auch "sed -i" nicht einfach eine Datei ändern. ( genauso wie jeder andere Editor auch, legt sed eine andere Datei an und gibt ihr den original Namen, die originale Datei wird dabei gelöscht.
Zu erkennen an den Inodenummer der Datei, die ändern sich bei einem "sed -i " Aufruf.
Code: Alles auswählen
LINUX> ls -il test.txt
3017864 -rw-r--r-- 1 robi users 2662 3. Okt 21:49 test.txt
LINUX> sed -in '/16/d' test.txt
LINUX> ls -il test.txt
3017895 -rw-r--r-- 1 robi users 2276 3. Okt 21:51 test.txt
Von da her ist dein Script schon im Ansatz unberechenbar und als ganzes ein Bug. Da du während der Ausführung eine Datei die du zum Lesen geöffnet hast durch die Bearbeitung mittels sed löscht und eine neue mit gleichem Namen anlegst, aber weiterhin aus der Orginaldatei (auch wenn schon im Dateisystem gelöscht) durch den immer noch offenen Filehandle und den ebenfalls offenen Cache der Datei vom Prozesses weiter ausließt, und in einer Schleife mit jedem weiterem Aufruf eine vorher schon geänderte Kopie vom letzten Durchlauf mit sed weiter bearbeitest und zwar auf Datenbasis der Orginaldatei.
Je nach dem wie schnell hier Teilprozesse im Script arbeiten, ist es sogar möglich das der Dateiname gelegentlich mal in einem Schleifendurchlauf gar nicht vorhanden ist, bzw unerwartet leer ist. Da innerhalb der Schleife der Name der Datei ständig auf eine andere Inode zeigt, kann sowas durchaus auch noch zu weiteren unberechenbaren Ergebnissen führen, wenn da nicht irgend ein "wait" zB. durch irgendwelche echo-Befehle innerhalb der Schleife dazu führt, das eine kleine Pause zwischen zwei sed Befehlen liegt die auf den gleichen Dateinamen lesen und schreiben .
robi