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
&>| 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
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 ...
NOCLOBBER
festgelegt haben. Verwenden Sie setopt clobber
diese Option , um das Standardverhalten wiederherzustellen.
Wenn Ihre Umgebung kein Überschreiben zulässt >
, verwenden Sie Pipe |
und tee
stattdessen 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/null
wie 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).