Nehmen wir an, ich habe ein Skript namens script
, das stdin
einige Ergebnisse liest und auf den Bildschirm ausspuckt.
Wenn ich den Inhalt einer Datei füttern wollte, hätte ich Folgendes eingegeben:
$ ./script < file1.txt
Aber was ist, wenn ich den Inhalt der mehreren Dateien auf dieselbe Weise in das Skript einspeisen möchte? Ist das überhaupt möglich? Das Beste, was ich mir bisher ausgedacht habe, war:
cat file1.txt file2.txt > combined.txt && ./script < combined.txt
Welches verwendet zwei Befehle und erstellt eine temporäre Datei. Gibt es eine Möglichkeit, dasselbe zu tun, aber die Erstellung der kombinierten Datei zu umgehen?
bash
shell
scripting
io-redirection
0x4B1D
quelle
quelle
zsh
cmd <file1 <file2 ... <fileN
Antworten:
Sie können
cat
und eine Pipe verwenden:Ihr Beispiel mit einer Pipe und ohne temporäre Datei:
quelle
join
ohne eine temporäre Datei zu verwenden, aber nur, um es dem Leser klar zu machen: Escat f1 f2
wird nicht die gleiche Ausgabe erzeugt wiejoin f1 f2
join
in meinem Beispiel verwendet, weil ich vorher damit gespielt habe; In Wirklichkeit habe ich für mein Beispiel verwendetcat
.Wenn Sie keine Pipe verwenden möchten, können Sie die Eingabeumleitung mit Prozessersetzung verwenden:
quelle
Um die Antwort von @Jonah Braun zu ergänzen, falls Sie jemals auch eine Prozessausgabe in Ihr Skript einfügen müssen, dh Ihre Datei befindet sich möglicherweise nicht auf Ihrer Festplatte, sondern wird
URL
mitcurl
oder einem ähnlichen Tool aufgerufen .So etwas könnte verwendet werden, um
stdout
mehrere Prozesse abzurufen und sie in einem Skript über zu verwendenstdin
Dies ist das Skript für die Eingabe von Inhalten von
multi-input.sh
:Testen Sie es jetzt:
Ausgabe:
<()
Drehungen verarbeiten eine virtuelle infile
Verwendung ,fd
wenn man so will, so<
benötigt wird , es zu lesen.cat
selbst braucht es nicht, weil es tut, was es tut, Dateien verkettet, virtuell oder real.quelle