In eine Datei schreiben, aber überschreiben, falls vorhanden
252
echo "text">>'Users/Name/Desktop/TheAccount.txt'
Wie mache ich es so, dass es die Datei erstellt, wenn sie nicht existiert, aber überschreibt, wenn sie bereits existiert. Im Moment wird dieses Skript nur angehängt.
Nun ... das ist großartig. Ich habe> etwas früher als >> bestätigt.
Jokester
Antworten:
411
Ein wenig Verständnis der Funktionsweise von * nix-Rohren würde helfen.
Kurz gesagt, der >>Umleitungsoperator hängt Zeilen an das Ende der angegebenen Datei an, wobei >die Datei größer als ist und die Datei leer und überschreibt.
@BrDaHa Wie kann ich stderr auch mit> | umleiten? auch? Ich habe versucht &> | aber es hat nicht funktioniert.
Tu Bui
@ TuBui nicht sicher, warum es nicht für Sie funktioniert. Auf meiner Maschine &>| filefunktioniert. Welche Shell und Version verwenden Sie? @stimulate für zsh sollten beide funktionieren , für bash ist es nur>|
Griddo
@Griddo meine Shell ist Bash Version 4.3.48 (1) -Veröffentlichung. echo "aaa" &>| test.txtführt zu einem Fehler -bash: syntax error near unexpected token |. Mein Noclobber ist eingeschaltet.
Tu Bui
1
@ TuBui Anscheinend habe ich nicht richtig getestet. Es funktioniert auch nicht für mich ... aber die Dokumentation besagt nicht, dass es sowieso möglich sein sollte. Sie müssen sich wahrscheinlich an eine echo "aaa" >| test.txt 2>&1andere Shell halten oder diese verwenden.
Griddo
40
Trotz NylonSmileder Antwort , die "irgendwie" richtig ist. Ich konnte Dateien auf diese Weise nicht überschreiben .
echo "i know about Pipes, girlfriend" > thatAnswer
zsh: file exists: thatAnswer
um meine Probleme zu lösen .. musste ich verwenden ... >!, á la ..
Dies bedeutet, dass Sie die nicht standardmäßige Option zsh NOCLOBBERfestgelegt haben. Verwenden Sie setopt clobber diese Option , um das Standardverhalten wiederherzustellen.
Michał Politowski
11
Wenn Ihre Umgebung kein Überschreiben zulässt >, verwenden Sie Pipe |und teestattdessen wie folgt:
echo "text"| tee 'Users/Name/Desktop/TheAccount.txt'
Beachten Sie, dass dies auch auf dem Standard gedruckt wird. Falls dies unerwünscht ist, können Sie die Ausgabe /dev/nullwie folgt umleiten :
echo "text"| tee 'Users/Name/Desktop/TheAccount.txt'>/dev/null
Wenn Sie sowohl std :: cerr als auch std :: cout in eine Datei umleiten möchten, während Sie noclobber gesetzt haben (dh set -o noclobber), können Sie den folgenden Code verwenden:
"Jetzt Foobar überschreiben ..." - das >>wird angehängt, nicht überschrieben
Drenai
-2
Wenn Sie eine Ausgabe haben, die Fehler enthalten kann, möchten Sie möglicherweise ein kaufmännisches Und und ein Größer als verwenden, wie folgt:
my_task &> 'Users/Name/Desktop/task_output.log' Dadurch werden sowohl stderr als auch stdout in die Protokolldatei umgeleitet (anstelle von nur stdout).
Antworten:
Ein wenig Verständnis der Funktionsweise von * nix-Rohren würde helfen.
Kurz gesagt, der
>>
Umleitungsoperator hängt Zeilen an das Ende der angegebenen Datei an, wobei>
die Datei größer als ist und die Datei leer und überschreibt.quelle
-bash: TheAccount.txt: cannot overwrite existing file
.>
und>>
sind die Ausgabeumleitungsoperatoren . Der Rohrbetreiber ist|
.>|
, um das Überschreiben zu erzwingenWenn Sie in Bash noclobber a la festgelegt haben
set -o noclobber
, verwenden Sie die Syntax>|
Beispielsweise:
echo "some text" >| existing_file
Dies funktioniert auch, wenn die Datei noch nicht vorhanden ist
Überprüfen Sie, ob noclobber eingestellt ist mit:
set -o | grep noclobber
Eine ausführlichere Erläuterung zu diesem speziellen Operatortyp finden Sie in diesem Beitrag
Eine ausführlichere Liste der Umleitungsoperatoren finden Sie in diesem Beitrag
quelle
&>| file
funktioniert. Welche Shell und Version verwenden Sie? @stimulate für zsh sollten beide funktionieren , für bash ist es nur>|
echo "aaa" &>| test.txt
führt zu einem Fehler-bash: syntax error near unexpected token |
. Mein Noclobber ist eingeschaltet.echo "aaa" >| test.txt 2>&1
andere Shell halten oder diese verwenden.Trotz
NylonSmile
der Antwort , die "irgendwie" richtig ist. Ich konnte Dateien auf diese Weise nicht überschreiben .echo "i know about Pipes, girlfriend" > thatAnswer
um meine Probleme zu lösen .. musste ich verwenden ...
>!
, á la ..Seien Sie vorsichtig damit ...
quelle
NOCLOBBER
festgelegt haben. Verwenden Siesetopt clobber
diese Option , um das Standardverhalten wiederherzustellen.Wenn Ihre Umgebung kein Überschreiben zulässt
>
, verwenden Sie Pipe|
undtee
stattdessen wie folgt:Beachten Sie, dass dies auch auf dem Standard gedruckt wird. Falls dies unerwünscht ist, können Sie die Ausgabe
/dev/null
wie folgt umleiten :quelle
quelle
Wenn Sie sowohl std :: cerr als auch std :: cout in eine Datei umleiten möchten, während Sie noclobber gesetzt haben (dh
set -o noclobber
), können Sie den folgenden Code verwenden:Weitere Informationen hierzu finden Sie unter https://stackoverflow.com/a/876242 .
Auch diese Antwort ist @ TuBuis Frage auf die Antwort @BrDaHa oben am 9. August 18 um 9:34.
quelle
So überschreiben Sie den Inhalt einer Datei in eine andere Datei. benutze Katze zB.
Um foobar zu überschreiben, können wir einen cat-Befehl wie unten verwenden
quelle
>>
wird angehängt, nicht überschriebenWenn Sie eine Ausgabe haben, die Fehler enthalten kann, möchten Sie möglicherweise ein kaufmännisches Und und ein Größer als verwenden, wie folgt:
my_task &> 'Users/Name/Desktop/task_output.log'
Dadurch werden sowohl stderr als auch stdout in die Protokolldatei umgeleitet (anstelle von nur stdout).quelle