การเขียนโปรแกรมเชลล์ (4)
การเรียกคำสั่งเชลล์หลายคำสั่งในหนึ่งบรรทัด
เราสามารถสั่งให้ลีนุกซ์ทำงานหลายคำสั่งได้ภายในหนึ่งบรรทัด โดยจะต้องทำการแยกแต่ละคำสั่งด้วยเครื่องหมาย semicolon ";" ดังตัวอย่างต่อไปนี้ คำสั่งสุดท้ายไม่ต้องใส่ ";"
$ date; pwd; echo "Hello world"
Wed Sep 3 00:36:35 GMT+7 1997
/home/twg
Hello world
จะเห็นว่าเชลล์ทำงานและแสดงผลลัพธ์ตามลำดับคำสั่งที่เราพิมพ์ไปข้างต้น หากต้องการเปลี่ยนทิศทางของผลลัพธ์ของคำสั่งทั้งหมด จะต้องครอบคำสั่งทั้งหมดด้วยเครื่องหมายปีกกา "{}" หรือไม่ก็ครอบด้วยเครื่องหมายวงเล็บ "()" เพราะหากไม่ครอบไว้แล้วจะกลายเป็นการเปลี่ยนทิศทางเฉพาะคำสั่งสุดท้ายเท่านั้น
$ { date; pwd; echo "Hello world" } > outfile
หรือ
$ ( date; pwd; echo "Hello world" ) > outfile
การครอบด้วยเครื่องหมายทั้งสองแบบจะให้ผลลัพธ์ในลักษณะเดียวกัน แต่แบบที่สองหรือที่ครอบด้วยเครื่องหมายวงเล็บ จะเป็นการสร้างซับเชลล์ขึ้นมาใหม่ สำหรับเรื่องซับเชลล์จะได้ทำการอธิบายในหัวข้อถัดไป
การสร้างฟังก์ชั่นของเชลล์
เราสามารถทำการนิยามฟังก์ชั่นของเชลล์ขึ้นมาใหม่ได้ โดยที่ฟังก์ชั่นนั้นก็จะเป็นการนำเอาคำสั่งของเชลล์หลายๆคำสั่งเข้ามารวมไว้ด้วยกัน และเราก็สามารถเรียกใช้งานฟังก์ชั่นนั้นแทนได้ ตัวอย่างข้างล่างจะแสดงถึงการนิยามฟังก์ชั่น
$ newfunction() { date; pwd; echo "Hello world" }
ตัวอย่างนี้จะแสดงถึงการเรียกใช้งานฟังก์ชั่น จะเห็นว่าเป็นเพียงการเรียกชื่อฟังก์ชั่น
$ newfunction
Wed Sep 3 00:54:42 GMT+7 1997
/home/twg
Hello world
เราสามารถใช้ประโยชน์ของฟังก์ชั่น ในลักษณะของการกำหนดโมดูลย่อยที่ถูก
เรียกใช้ประจำจากโปรแกรมเชลล์อื่น หรืออาจใช้ทำการสร้างคำสั่งที่ต้องการ
ใช้แตกต่างไปจากปกติก็ได้ เช่น
$ li() { ls -CF }
$ li
Mail/ News/ errfile histfile jj lib/ mbox myfile
ต่อไปนี้เราก็สามารถใช้คำสั่ง "li" แทนการพิมพ์คำสั่งว่า "ls -CF" ได้
การใช้งานไปป์ (pipe)
การใช้งานไปป์เป็นการนำเอาผลลัพธ์จากคำสั่งหนึ่ง ไปเป็นข้อมูลเข้าของอีกคำสั่งหนึ่ง ซึ่งโปรแกรมที่ใช้งานในลักษณะนี้จะถูกเรียกว่า "ตัวกรองข้อมูล" หรือ "ฟิลเตอร์ (filter)" โปรแกรมต่อไปนี้มีลักษณะการใช้งานเป็นแบบฟิลเตอร์
cat, sort, more, grep, tee และ tr
ตัวอย่างของการใช้ไปป์
$ ls | grep file | sort
เป็นการเรียงลำดับข้อมูลที่ได้จากการคัดเลือกรายชื่อไฟล์ที่มีชื่อ "file" เป็นส่วน ประกอบ
การเรียกโปรแกรมให้ทำงานแบบหลังฉาก
ที่ผ่านมาจะเห็นว่าเมื่อทำการเรียกใช้คำสั่งหรือเรียกใช้งานโปรแกรม เราจะต้องรอให้โปรแกรมนั้นทำงานเสร็จสิ้นเสียก่อนจึงจะเรียกใช้คำสั่งอื่นๆต่อไปได้ เรามีวิธีที่จะเรียกใช้งานโปรแกรมอื่นได้ โดยไม่ต้องรอให้โปรแกรมแรกทำงานเสร็จเสียก่อน ซึ่งสามารถทำได้โดยการส่งโปรแกรมแรกไปทำงานแบบหลังฉาก (Background process) ด้วยวิธีนี้ ถึงแม้ว่าโปรแกรมแรกจะยังทำงานไม่เสร็จ เราก็สามารถสั่งคำสั่งอื่นๆได้
การเรียกใช้โปรแกรมแบบหลังฉากทำได้โดยการเพิ่ม "&" ต่อท้ายคำสั่ง
ต่อไปนี้จะแสดงความแตกต่างระหว่างการใช้งานโปรแกรมแบบปกติ และการเรียกใช้งานโปรแกรมแบบหลังฉาก
การเรียกโปรแกรมแบบปกติ (ต้องรอ)
$ sleep 10 : การเรียกใช้งาน "sleep" ตามปกติ ต้องรอถึง 10 วินาที
: ก่อนที่จะเรียกใช้งานคำสั่งอื่นได้
$ date : ในที่นี้เรียกใช้งานคำสั่ง "date" ต่อจาก "sleep"
Wed Sep 3 01:12:52 GMT+7 1997
การเรียกโปรแกรมแบบหลังฉาก (ไม่ต้องรอ)
$ sleep 10 & : เรียกใช้งาน "sleep" แบบหลังฉาก เชลล์จะคืนพร้อมพต์
: ให้เรียกใช้คำสั่งต่อไปได้ทันที
[1] 3121 : เชลล์จะบอกหมายเลขโพรเซสของโปรแกรมหลังฉากให้
$ date : ในที่นี้เรียกใช้งานคำสั่ง "date" ต่อจาก "sleep"
Wed Sep 3 01:12:52 GMT+7 1997
$ ps : เรียกคำสั่ง "ps" เพื่อดูโพรเซสของโปรแกรม "sleep"
: (หมายเลข 3121) ซึ่งตอนนี้กำลังทำงานแบบหลังฉาก
PID TTY STAT TIME COMMAND
962 p2 S 0:00 login -h localhost -p
963 p2 S 0:00 -bash
3121 p2 S 0:00 sleep 10
3125 p2 R 0:00 ps
ประโยชน์ของการเรียกโปรแกรมแบบหลังฉากนี้ จะใช้งานกับโปรแกรมที่ต้องการเวลาในการทำงานมากและไม่ต้องการติดต่อกับผู้ใช้ เช่นการค้นหารายชื่อไฟล์ทั้งระบบ ซึ่งจะต้องกินเวลานานมาก การสั่งงานโปรแกรมให้ทำงานแบบหลังฉาก จะช่วยทำให้ผู้ใช้ไม่ต้องคอยจนกว่างานจะเสร็จ
อย่างไรก็ตามการใช้งานโปรแกรมแบบหลังฉากจะไม่สะดวกกับโปรแกรมที่ต้องมีการติดต่อกับผู้ใช้ผ่านทางจอภาพปกติ ในที่นี้เราอาจจะต้องเปลี่ยนไปใช้แฟลกไฟล์ (flag file) เพื่อทำการติดต่อกับโปรแกรมแทน หรืออีกวิธีหนึ่งคือเปลี่ยนไปใช้การติดต่อผ่านทางสัญญาณของระบบ (system signals) ซึ่งเรื่องสัญญาณนี้จะได้ทำการอธิบายต่อไปภายหลัง
HTML developed by Kaiwal Development Team (kaiwal@geocities.com)