Kurzform zum Einfügen von Inhalten mehrerer Dateien in die Standardeingabe eines Skripts

20

Nehmen wir an, ich habe ein Skript namens script, das stdineinige 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?

0x4B1D
quelle
zshcmd <file1 <file2 ... <fileN
Wechseln

Antworten:

20

Sie können catund eine Pipe verwenden:

cat file1 file2 file3 ... fileN | ./script

Ihr Beispiel mit einer Pipe und ohne temporäre Datei:

join file1.txt file2.txt | ./script
Bruce Ediger
quelle
D'oh. Es ist so einfach, ich bin mir nicht mal sicher, wie ich es selbst nicht realisiert habe. Vielen Dank!
0x4B1D
10
Nützliche Verwendung von Cat Award!
Glenn Jackman
4
@ Bruce Ediger: Ich nehme an, Sie haben nur einen Weg aufgezeigt, joinohne eine temporäre Datei zu verwenden, aber nur, um es dem Leser klar zu machen: Es cat f1 f2wird nicht die gleiche Ausgabe erzeugt wiejoin f1 f2
Peter.O
@fred danke für diesen Hinweis - ich habe ihn joinin meinem Beispiel verwendet, weil ich vorher damit gespielt habe; In Wirklichkeit habe ich für mein Beispiel verwendet cat.
0x4B1D
10

Wenn Sie keine Pipe verwenden möchten, können Sie die Eingabeumleitung mit Prozessersetzung verwenden:

./script <(cat file1 file2)
Jonah Braun
quelle
3

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 URLmit curloder einem ähnlichen Tool aufgerufen .

So etwas könnte verwendet werden, um stdoutmehrere Prozesse abzurufen und sie in einem Skript über zu verwendenstdin

Dies ist das Skript für die Eingabe von Inhalten von multi-input.sh:

#!/usr/bin/env bash
while read line; do
    echo $line
done

Testen Sie es jetzt:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

Ausgabe:

process 1
process 2
process 3

<()Drehungen verarbeiten eine virtuelle in fileVerwendung , fdwenn man so will, so <benötigt wird , es zu lesen. catselbst braucht es nicht, weil es tut, was es tut, Dateien verkettet, virtuell oder real.

sdkks
quelle