Friday, July 4, 2008

shell(2)

find

ตั้งใจจะจบเรื่อง shell ไว้เท่าที่เขียนไป แต่มานึกดูอีกที หากขาดรายละเอียดของทั้ง ไฟ, find, และ เสร็จ, sed ที่ใช้ประกอบการบรรยาย ก็เหมือนว่ากินข้าว แล้วไม่ดื่มน้ำตาม ก็ด้วยเหตุนี้แล จึงมีภาคนี้เป็นลำดับถัดมา

find(1) ที่ใช้ค้นหาเอกสารนั้น มีรูปแบบง่ายๆ อย่างที่ยกมานั่นคือ
# find  /usr/ports  -name work  -type d  -print
ซึ่งมีความหมายตรงไปตรงมาคือ ให้หา จาก /usr/ports เอกสารชื่อ work ที่เป็น directory ส่วนที่เหลือนั้นบอกว่า ให้พิมพ์ออกมาเมื่อหาเจอ,  -print
ผลลัพธ์ก็คือ, สำหรับ goffice2,
/usr/ports/converters/fribidi/work
/usr/ports/converters/psiconv/work
/usr/ports/deskutils/glabels/work
/usr/ports/deskutils/planner/work
/usr/ports/devel/goffice/work
/usr/ports/devel/libgsf-gnome/work
/usr/ports/devel/goffice04/work
/usr/ports/editors/abiword/work
/usr/ports/editors/gnome2-office/work
/usr/ports/graphics/dia/work
/usr/ports/graphics/libwmf/work
/usr/ports/math/gnumeric/work
/usr/ports/textproc/wv/work

ซึ่งเรียกกัน หรือ รู้กันว่า คือ temporary working directory, ${WRKDIR}, และจะพิมพ์ออกมาทาง standard output,  stdout ทีละบรรทัด ทีละบรรทัดไป และนี่แหละคือ ไฟ, find(1)

ถ้าเป็นเช่นนี้ คงไม่ใช่ shell ที่เราต้องการ เพราะสิ่งที่เราต้องการคือ, ยกมาจำเพาะผลลัพธ์ บางส่วน,

cd /usr/ports/converters/fribidi && make package
cd /usr/ports/converters/psiconv && make package
....
cd /usr/ports/textproc/wv && make package


ก็แล้วเราจะเปลี่ยนให้ /usr/ports/converters/fribidi/work เป็น cd /usr/ports/converters/fribidi && make package ได้ยังไง ซึ่งก็นี่แหละคือหน้าที่ของ เสร็จ, sed(1) ไงละ

sed
คำสั่งเสร็จที่ใช้ในตัวอย่างที่ยกมาคือ
# sed  -e 's,/usr,cd /usr,'  -e 's,/work, \&\& make package,'
ซึ่งขอยกรูปแบบทั่วไปที่ใช้ตอนนี้มาให้เห็นคือ
# sed   -e  'sDELIMITtextDELIMITnew textDELIMIT'
โดยที่ input ของเสร็จ จะเป็น output ของ ไฟ เพราะส่งกันมาด้วย ท่อ, pipe อีกทีหนึ่ง ก็ต้องเป็นยังงี้แหละ เมื่อ ไฟ ส่งมา ๑ บรรทัด เสร็จ เขาก็จะ process ไป ๑ ที แล้วก็ส่งผลลัพธ์ไปที่ stdout

คราวนี้คงง่ายแล้วใช่ไหม ในการที่จะอ่านสิ่งที่ ได้บอกไว้ตั้งแต่ ports(1) โน้น โดยที่เราเลือกที่จะใช้ตัว คอมม่า เป็นตัว DELIMIT เพื่อแก้ไขตัว text ให้ได้ตามใจ
อ้อ เราต้องแก้ ๒ หนนะ ก็เลยต้องมี สีลบออง ๒ ลบอี sed  -e 's, , ,'  -e 's, , ,' โดยลบอีแรก เราแก้จาก /usr เป็น cd /usr และ ลบอีหลัง เราแก้จาก /work เป็น && make package แต่ สืบเนื่องจากตัว && นั้น มีความหมายพิเศษ เราจึง ยกความหมาย มันออกไปไว้ที่อื่นชั่วคราว ด้วยการใช้ ตัว \ ไงครับ

เสร็จ เอ้ยจบ find & sed และย้ำว่า โปรดศึกษา find(1) & sed(1) เพิ่มเติมด้วย

ขอย้ำว่า เรื่องของ sh ที่นำเสนอนี้ เป็นแต่เพียงสาระเบื้องต้นเท่านั้น และยังหยาบมากอยู่ เพราะยังขาด ในส่วนของการตรวจสอบข้อบกพร่อง ยังขาดการตรวจสอบ return code ของแต่ละคำสั่ง และยังขาดอีก ฯลฯ ขอให้ผู้ใฝ่รู้จงหาความรู้เพิ่มเติมเอาเองจาก sh(1)

ขอให้ประสบความสำเร็จ และ โชคดี

No comments:


View My Stats