Warum kann ich die Ausgabe eines Befehls, der die Datei selbst als Eingabe akzeptiert, nicht in einer Datei speichern?

Warum kann ich die Ausgabe eines Befehls, der die Datei selbst als Eingabe akzeptiert, nicht in einer Datei speichern?

Hier ist beispielsweise der Befehl, den ich verwende:

tr -d '\n' < newfile.ppm 

Ich möchte die Ergebnisse in genau dieselbe Datei ausgeben und mache jetzt Folgendes:

tr -d '\n' < newfile.ppm > newfile.ppm

Warum funktioniert das nicht und wie kann ich es zum Laufen bringen?

Antwort1

Dies ist ein äußerst häufiges Problem.

Wenn Sie stdout oder stderr umleiten, um in eine Datei zu schreiben, kürzt die Shell zuerst die Datei, um sie für das Schreiben vorzubereiten. Was also passiert, ist ungefähr das Folgende:

  1. Ihre Shell setzt stdin aufnewfile.ppm
  2. Ihre Shell wird newfile.ppmauf die Länge 0 gekürzt
  3. Ihre Shell setzt stdout aufnewfile.ppm
  4. Ihre Shell führt aus tr -d '\n'. Wie Sie sehen, newfile.ppmist der Inhalt von an dieser Stelle bereits verschwunden, es gibt also nichts zu lesen.

Um dies zu umgehen, geben Sie stattdessen einfach eine andere Datei aus. Sie können diese dann anschließend umbenennen

Antwort2

Damit erledigen Sie die gewünschte Arbeit.

[stephan@stephan] ~ 
$ echo "meh                                    
" > file
[stephan@stephan] ~ 
$ cat file | tr -d '\n' > file ; cat file 
meh

verwandte Informationen