วิธีการหนึ่งที่อาจเป็นไปได้คือการwhile...read
สร้างโครงสร้างภายในฟังก์ชั่นของคุณซึ่งจะประมวลผลข้อมูลใด ๆ ที่เข้ามาในฟังก์ชันผ่าน STDIN ทำงานกับมันแล้วปล่อยข้อมูลผลลัพธ์ออกมาทาง STDOUT
function X {
while read data; do
...process...
done
}
จะต้องใช้ความระมัดระวังในการกำหนดค่าwhile ..read..
ส่วนประกอบของคุณเนื่องจากจะขึ้นอยู่กับประเภทของข้อมูลที่พวกเขาจะสามารถใช้งานได้อย่างน่าเชื่อถือ อาจมีการกำหนดค่าที่เหมาะสมที่สุดที่คุณสามารถทำได้
ตัวอย่าง
$ 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; }
นี่คือฟังก์ชั่นแต่ละอย่างด้วยตัวเอง
$ echo "hi" | logF
[F:02/07/14 20:01:11] hi
$ echo "hi" | logG
G:hi
$ echo "hi" | logH
H:hi
นี่คือเมื่อเราใช้พวกเขาด้วยกัน
$ 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
พวกเขาสามารถใช้รูปแบบการป้อนข้อมูลที่หลากหลาย
#-- 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(...)))
หรือฟังก์ชั่นแต่ละอย่างอ่านจากอินพุตมาตรฐาน (read x; ...
) และเขียนไปยังเอาต์พุตมาตรฐาน (echo ...
)