Innere Logik von Kettenumleitungen

Innere Logik von Kettenumleitungen

Wenn ich tippe

cat some_file > new_file1 > new_file2

Ich habe eine Ausgabe von some_filein new_file2und empty erhalten new_file1.

Was ist die innere Logik dahinter? Genauer gesagt, was ist der Zweck stdoutder Datei?

Hinweis: Unter Windows wird die mittlere Datei übersprungen.

Antwort1

Das hängt von der Schale ab.

In Bash echo derp >file1 >file2wird zuerst geöffnet file1, es wird abgeschnitten und dann wird dafür gesorgt, dass das stdoutvon echo derpin geschrieben wird file1. Dann macht Bash dasselbe für file2: es öffnet file2, kürzt es und sorgt dafür, dass das stdoutvon echo derpstatt in geschrieben wird file2.

Der Nettoeffekt ist, dass file1abgeschnitten wird (d. h. der Inhalt wird gelöscht) und stdoutnur 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 | catErgebnisse in „derp“ werden in die Datei geschrieben, nicht in die Pipe.

echo derp >file1 >file2In zsh schreibt jedoch sowohl in file1als auch file2, wie Sie es vielleicht intuitiv erwarten. man zshmiscWeitere 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/nullist gleichwertig mit zshs echo derp >file1 >file2.

verwandte Informationen