
Wenn ich tippe
cat some_file > new_file1 > new_file2
Ich habe eine Ausgabe von some_file
in new_file2
und empty erhalten new_file1
.
Was ist die innere Logik dahinter? Genauer gesagt, was ist der Zweck stdout
der Datei?
Hinweis: Unter Windows wird die mittlere Datei übersprungen.
Antwort1
Das hängt von der Schale ab.
In Bash echo derp >file1 >file2
wird zuerst geöffnet file1
, es wird abgeschnitten und dann wird dafür gesorgt, dass das stdout
von echo derp
in geschrieben wird file1
. Dann macht Bash dasselbe für file2
: es öffnet file2
, kürzt es und sorgt dafür, dass das stdout
von echo derp
statt in geschrieben wird file2
.
Der Nettoeffekt ist, dass file1
abgeschnitten wird (d. h. der Inhalt wird gelöscht) und stdout
nur in geht file2
. Es findet keine Verkettung statt. Bash kann stdout nur an eine Stelle gleichzeitig umleiten. Dies gilt auch für Pipes: echo derp > file | cat
Ergebnisse in „derp“ werden in die Datei geschrieben, nicht in die Pipe.
echo derp >file1 >file2
In zsh schreibt jedoch sowohl in file1
als auch file2
, wie Sie es vielleicht intuitiv erwarten. man zshmisc
Weitere Informationen finden Sie unter MULTIOS in , wenn Sie zsh verwenden.
Um dies außerhalb von zu erreichen zsh
, können Sie einfach verwenden tee
: echo derp | tee file1 file2 > /dev/null
ist gleichwertig mit zshs echo derp >file1 >file2
.