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.
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.
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.
echo "text" > 'Users/Name/Desktop/TheAccount.txt'
-bash: TheAccount.txt: cannot overwrite existing file.
>und >>sind die Ausgabeumleitungsoperatoren . Der Rohrbetreiber ist |.
>|, um das Überschreiben zu erzwingen
Wenn 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
&>| filefunktioniert. Welche Shell und Version verwenden Sie? @stimulate für zsh sollten beide funktionieren , für bash ist es nur>|
echo "aaa" &>| test.txtführt zu einem Fehler -bash: syntax error near unexpected token |. Mein Noclobber ist eingeschaltet.
echo "aaa" >| test.txt 2>&1andere Shell halten oder diese verwenden.
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 ..
[[ $FORCE_IT == 'YES' ]] && echo "$@" >! "$X" || echo "$@" > "$X"
Seien Sie vorsichtig damit ...
NOCLOBBERfestgelegt haben. Verwenden Sie setopt clobber diese Option , um das Standardverhalten wiederherzustellen.
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
#!/bin/bash
cat <<EOF > SampleFile
Put Some text here
Put some text here
Put some text here
EOF
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:
cmd >|file.txt 2>&1
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.
So überschreiben Sie den Inhalt einer Datei in eine andere Datei. benutze Katze zB.
echo "this is foo" > foobar.txt
cat foobar.txt
echo "this is bar" > bar.txt
cat bar.txt
Um foobar zu überschreiben, können wir einen cat-Befehl wie unten verwenden
cat bar.txt >> foobar.txt
cat foobar.txt
>>wird angehängt, nicht überschrieben
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).