Wie man mit einer Pipe in Unix überschreibt

796
bordenE

Also versuche ich mit einer Pipe zu überschreiben:

 //reads contents of file| turns lowercase to uppercase | changes $ to # | // then attempts to overwrite original file with new version cat cutTester.txt|tr '[a-z]' '[A-Z]'|tr '$' '#' >cutTester.txt 

Aber wenn ich das tue, wischt es einfach die Datei ab. Dies ist der Inhalt der Datei

 $first$second$third$fourth $fifth$sixth$seventh$eighth $ninth$tenth$eleventh$twelveth $thirteenth$fourthteenth$fifthteenth$sixthteenth $seventeenth$eightteenth$nineteenth$twenty $twenty-one$twenty-two$twenty-three$twenty-four 
1
Siehe [Warnung bezüglich ''> ''] (// unix.stackexchange.com/q/159513/23408#186126). Scott vor 7 Jahren 1

1 Antwort auf die Frage

0
Andrew Palmer

Was passiert ist, dass Sie cutTester.txtmit der >Umleitungsnotation " " abschneiden . Sie bearbeiten dann Ihre trBefehle für die umgeleitete Ausgabe einer leeren Eingabedatei.

Beachten Sie, dass Folgendes auch die Datei abschneidet:

$ cat cutTester.txt > cutTester.txt 

Insbesondere wenn Sie ein Entwickler sind, sind Sie möglicherweise daran gewöhnt, Aussagen wie zu schreiben x=`eval $x + 1`, in denen der evalAusdruck vor der Zuweisung ausgewertet wird. Das Verhalten von Umleitungsoperatoren ist jedoch nicht analog. Bedenken Sie, dass die Implementierung der Rückgabe einer Datei an sich selbst höchstwahrscheinlich erfordert, dass die Shell im Hintergrund temporäre Dateien erstellt, und dass die Operation nicht so einfach oder effizient ist wie das einfache Zuweisen einer Variablen (die nur im Speicher vorhanden ist).

Glücklicherweise ist es einfach genug, eine temporäre Datei explizit selbst zu erstellen:

#!/bin/bash  # reads contents of file| turns lowercase to uppercase | changes $ to # | # then attempts to override original file with new version  cat cutTester.txt | tr '[a-z]' '[A-Z]' | tr '$' '#' > cutTester.tmp; mv cutTester.tmp cutTester.txt 
Wahrscheinlich möchten Sie das `; 'durch ein` && `ersetzen, damit Sie Ihre ursprüngliche Datei nicht verlieren, wenn der Befehl fehlschlägt oder abgebrochen wird. Der Befehl `cat` verschwendet nur Zeit, wenn eine zusätzliche Kopie erstellt wird. Umleiten Sie einfach die Eingabe von tr, `tr spectras vor 7 Jahren 0