Auf diese Weise habe ich einige Funktionen definiert:
function f {
read and process $1
...
echo $result
}
Ich möchte sie zusammenstellen, damit der Aufruf so aussieht f | g | h
.
Welches Idiom soll ich verwenden, um eine Funktion, die mit Argumenten arbeitet, in eine Funktion zu konvertieren, die Argumente aus stdin liest? Ist es möglich, Paare, Tupel von Argumenten aus dem Stream zu lesen, ohne dass diese entkommen müssen (z. B. Null-Terminierung)?
bash
shell-script
pipe
Rumca
quelle
quelle
h(g(f(...)))
oder jede der Funktionen liest von der Standardeingabe (read x; ...
) und schreibt in die Standardausgabe (echo ...
).Antworten:
Ein möglicher Ansatz wäre, ein
while...read
Konstrukt in Ihre Funktionen einzufügen, das alle über STDIN in die Funktion eingegangenen Daten verarbeitet, verarbeitet und die resultierenden Daten dann über STDOUT wieder ausgibt.Sie müssen sorgfältig darauf achten, wie Sie Ihre
while ..read..
Komponenten konfigurieren, da diese in hohem Maße von den Datentypen abhängen, die sie zuverlässig verarbeiten können. Möglicherweise gibt es eine optimale Konfiguration, die Sie finden können.Beispiel
Hier ist jede Funktion für sich.
Hier sind sie, wenn wir sie zusammen benutzen.
Sie können verschiedene Arten der Eingabe annehmen.
quelle
Als Ergänzung zu slms Antwort habe ich einige Experimente mit Nullen getrennten Tupeln als Funktionsargumente durchgeführt:
Anmerkungen:
sayTuple
Liest zweimal einen nullterminierten Datensatz-d $'\0'
, der alle Leerzeichen um die Eingabe behandeltIFS=
.echo
Datensätze umgeben von-
Das Ergebnis zeigt, dass nullterminierte Eingaben korrekt verarbeitet werden
\n
, und\t
:Bitte fügen Sie Verbesserungsvorschläge in die Kommentare ein, es ist ein interessantes Thema.
quelle
sayTuple() { arr=() ; while IFS= read -r -d $'\0' arg; do arr+="$arg"; done; echo "sayTuple: ${arr[@]}"; }
.IFS= read -r -d $'\0' -a arg
aber ich konnte das nicht zum Laufen bringen. Dies würde das Entfernen von ermöglichenwhile
, was unnötig erscheint, aber das einzige Muster war, das ich zur Arbeit bringen konnte.