การเขียนโปรแกรมเชลล์ (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)