Một cách tiếp cận tiềm năng là đặt một while...read
cấu trúc bên trong các chức năng của bạn để xử lý bất kỳ dữ liệu nào đi vào chức năng thông qua STDIN, vận hành trên nó và sau đó phát ra dữ liệu kết quả qua STDOUT.
function X {
while read data; do
...process...
done
}
Cần phải cẩn thận với cách bạn định cấu hình các while ..read..
thành phần của mình vì chúng sẽ phụ thuộc nhiều vào loại dữ liệu mà chúng sẽ có thể tiêu thụ một cách đáng tin cậy. Có thể có một cấu hình tối ưu mà bạn có thể đưa ra.
Thí dụ
$ 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; }
Đây là mỗi chức năng của chính nó.
$ echo "hi" | logF
[F:02/07/14 20:01:11] hi
$ echo "hi" | logG
G:hi
$ echo "hi" | logH
H:hi
Chúng ở đây khi chúng ta sử dụng chúng cùng nhau.
$ 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
Họ có thể có nhiều phong cách đầu vào.
#-- 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(...)))
hoặc từng hàm đọc từ đầu vào tiêu chuẩn (read x; ...
) và ghi vào đầu ra tiêu chuẩn (echo ...
).