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.
function X {
while read data; do
...process...
done
}
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
$ logF() { while read data; do echo "[F:$(date +"%D %T")] $data"; done; }
$ logG() { while read data; do echo "G:$data"; done; }
$ logH() { while read data; do echo "H:$data"; done; }
Hier ist jede Funktion für sich.
$ echo "hi" | logF
[F:02/07/14 20:01:11] hi
$ echo "hi" | logG
G:hi
$ echo "hi" | logH
H:hi
Hier sind sie, wenn wir sie zusammen benutzen.
$ echo "hi" | logF | logG | logH
H:G:[F:02/07/14 19:58:18] hi
$ echo -e "hi\nbye" | logF | logG | logH
H:G:[F:02/07/14 19:58:22] hi
H:G:[F:02/07/14 19:58:22] bye
Sie können verschiedene Arten der Eingabe annehmen.
#-- ex. #1
$ cat <<<"some string of nonsense" | logF | logG | logH
H:G:[F:02/07/14 20:03:47] some string of nonsense
#-- ex. #2
$ (logF | logG | logH) <<<"Here comes another string."
H:G:[F:02/07/14 20:04:46] Here comes another string.
#-- ex. #3
$ (logF | logG | logH)
Look I can even
H:G:[F:02/07/14 20:05:19] Look I can even
type to it
H:G:[F:02/07/14 20:05:23] type to it
live
H:G:[F:02/07/14 20:05:25] live
via STDIN
H:G:[F:02/07/14 20:05:29] via STDIN
..type Ctrl + D to stop..
#-- ex. #4
$ seq 5 | logF | logG | logH
H:G:[F:02/07/14 20:07:40] 1
H:G:[F:02/07/14 20:07:40] 2
H:G:[F:02/07/14 20:07:40] 3
H:G:[F:02/07/14 20:07:40] 4
H:G:[F:02/07/14 20:07:40] 5
#-- ex. #5
$ (logF | logG | logH) < <(seq 2)
H:G:[F:02/07/14 20:15:17] 1
H:G:[F:02/07/14 20:15:17] 2
h(g(f(...)))
oder jede der Funktionen liest von der Standardeingabe (read x; ...
) und schreibt in die Standardausgabe (echo ...
).