ปฏิบัติการครังที่ ๒ ตอนที่ ๐ เตรียมการ --------------------- ที่ Home directory (~) สร้างไดเรกทอรีชื่อ 886326 -- ~/886326 $ mkdir 886326 ตรวจสอบผลการทำงานด้วยคำสั่ง ls -l ซึ่งควรจะได้ผลดังตัวอย่าง $ ls -l drwx------ 2 <ชื่อเจ้าของ> <ชื่อกลุ่ม> <ขนาดของแฟ้มเป็นไบต์> <วันเวลาที่มีการใช้งานแฟ้มครั้งสุดท้าย> 886326 ทดลองสร้างไดเรกทอรีเดิมซ้ำ $ mkdir 886326 mkdir: cannot create directory `886326': File exists # error message นี้หมายความว่าอย่างไร เข้าสู่ไดเรกทอรี 886326 $ cd 886326 ตรวจสอบยืนยันด้วยคำสั่ง pwd (print working directory) $ pwd # current หรือ working directory ปัจจุบันมี Abosolute pathname เป็น ... ... ... ใช้โปรแกรม vi สร้างแฟ้มดังนี้ $ vi xx.txt ~ กดแป้น i (insert) เพื่อแทรกข้อมูลในทำงาน (work buffer) และพิมพ์สายอักขระดังนี้ 0123456789 ~ ขณะนี้ cursor อยู่หลังเลข 9 -- ถ้ามีการพิมพ์อักขระตัวต่อไป อักขระนั้นจะแทนที่ cusror ซึ่งจะเลื่อนต่อไปทางขวา --> ขณะนี้ยังอยู่ใน Edit Mode repeat กดแป้น Esc เพื่อเข้าสู่ Command mode -- สังเกตว่าตำแหน่ง cursor กลับมาอยู่เลข 9 ซึ่งเป็นอักขระขวาสุดของบรรทัด กดแป้น yy เพื่อรวบตัว (yank) บรรทัดปัจจุบัน ลงใน buffer กดแป้น p เพื่อวางข้อมูลใน buffer ลงใต้บรรทัดปัจจุบัน 0123456789 0123456789 ~ สังเกตว่า cursor อยู่ที่เลข 0 ซึ่งเป็นอักขระตัวแรกของบรรทัดที่สอง กดแป้น x เพื่อลบตัวอักษรที่ตำแหน่ง cursor 0123456789 123456789 ~ กดแป้น A (Append) เพื่อเพิ่มตัวอักษรที่ท้ายบรรทัด -- เข้าสู่ Edit Mode -- cursor อยู่หลังเลข 9 กดแป้น 0 0123456789 1234567890 ~ ขณะนี้ cursor อยู่หลังเลข 0 --> แสดงว่ายังอยู่ใน Edit mode until พิมพ์สายอักขระได้ครบตามจำนวนที่กำหนดไว้ ตามตัวอย่างต่อไปนี้ $ cat xx.txt 0123456789 1234567890 2345678901 3456789012 4567890123 5678901234 6789012345 7890123456 8901234567 9012345678 เมื่อพิมพ์เสร็จแล้ว ให้ Save แฟ้มและออกจากโปรแกรม vi โดย 1. กดแป้น Esc เพื่อออกจาก Edit mode, กดแป้น : (colon) เพื่อเข้าสู่ Last Line mode, พิมพ์คำสั่ง wq , หรือ 2. กดแป้น Esc เพื่อออกจาก Edit mode, กดแป้น [Shift] ZZ เพื่อ save และ quit ทำการคัดลอกแฟ้ม xx.txt เป็นแฟ้มชื่อต่างๆ อีก 3 แฟ้ม $ cp xx.txt xy.txt $ cp xx.txt xz.txt $ cp xx.txt yy.txt $ ls xx.txt xy.txt xz.txt yy.txt ตอนที่ ๑ Tips & Techniques -------------------------------- 1. แฟ้มหรือไดเรกทอรี? -- option ของคำสั่ง ls (เพิ่มเติม) คำสั่ง ls โดยไม่มี option ใดเลย จะแสดงเฉพาะรายชื่อ ซึ่งอาจเป็นชื่อแฟ้มหรือชื่อไดเรกทอรัก็ได้ ในกรณีที่ต้องการให้ระบบช่วยใน การแยก "วัตถุ" ต่างๆที่อยู่ใน directory ทำได่โดยการกำหนด option -F -F (classify) จำแนกประเภทแฟ้มด้วยการเติมอักขระพิเศษต่อท้าย ได้แก่ / (directory), * (executable), @ (symbolic link), ... เนื่องจากอักษรตัวเล็กและตัวใหญ่ของ option มีความหมายต่างกัน option -f จึงมีความหมายสมนัยกับ -au ดังนี้ -f (enable -aU) เมื่อ -a (all) - do not ignore entries starting with . -U (unsorted) - do not sort; list entries in directory order และในทำนองเดียวกัน option -u และ -U แตกต่างกัน -- ศึกษารายละเอียดเพิ่มเติมได้จาก Online manual page ตัวอย่าง --------- $ ls -F a.out* # a.out เป็น executable file 886326/ # 886326 เป็น directory ... 2. การเติมชื่อแฟ้มที่เหลือโดยอัตโนมัติ - Filename completion (Bourne Again Shell) การใช้ชื่อแฟ้มประกอบคำสั่ง เมื่อผู้ใช้ป้อนตัวอักษรของชื่อแฟ้มจนถึงระดับที่สามารถแยกชื่อแฟ้มนั้นจากชื่อแฟ้มอื่นในระบบได้ ผู้ใช้สามารถ กดแป้น Tab เพื่อกำหนดให้ bash เติมอักษรที่เหลือให้โดยอัตโนมัติได้ ในกรณีที่ผู้ใช้กดแป้น Tab ในตำแหน่งที่ shell ยังไม่สามารถแยกแยะ ชื่อแฟ้มได้ shell จะแสดงรายชือแฟ้มทั้งหมดที่ตรงกับตัวอักษรที่พิมพ์มาแล้ว ดังตัวอย่าง ข้อตกลง: หมายถึงการกดแป้น Tab และ หมายถึงการกดแป้น Enter ตัวอย่าง --------- $ ls xx.txt xy.txt xz.txt yy.txt $ cat y จะได้ $ cat yy.txt # ผู้ใช้สามารถกดแป้น Enter เพื่อให้ระบบทำงานได้เลย หรืออาจเพิ่มเติมข้อมูลอื่นอีก แล้วแต่ความต้องการ $ cat x จะไม่มีอะไรเกิดขึ้น หาก อีกครั้งหนึ่งจะได้รายชื่อแฟ้มที่ขึ้นต้นด้วย x และแสดง Command prompt xx.txt xy.txt xz.txt $ cat x หากต้องการแฟ้ม xy.txt $ cat x <กดแป้น y><กดแป้น Tab> จะได้ $ cat xy.txt ตอนที่ ๒ อภิปรายผล ---------------------- เมื่อแน่ใจว่าเข้าใจและสามารถใช้งาน Automatic filename completion ชัดเจนดีแล้ว หากผู้เรียนต้องการทำงานเช่นนี้บ้าง ควรต้องมีขั้นตอน ในการทำงานอย่างไร แต่ละขั้นตอนเพียงแต่บอกว่าจะทำอะไร ยังไม่ต้องมีรายละเอียดว่าจะทำอย่างไร --> Algorithm begin อ่านชื่อแฟ้มในไดเรกทอรี ... ... end งานนี้ควรได้จับกลุ่มกับเพื่อนช่วยกันคิดและปรับปรุง กว่าจะเป็นขั้นตอนวิธีที่สมบูรณ์ต้องปรับแก้หลายครั้ง ใจเย็นๆ ค่อยๆ ทำไป -- กรุงโรมไม่ได้สร้างเสร็จในวันเดียว แต่ก็ไม่ได้ใช้เวลาสร้างชั่วกัปชั่วกัลป์ -- ไม่หัดก็ทำไม่เป็น ตอนที่ ๓ การนับจำนวน Utilities ที่มีในเครื่อง angsila.cs.buu.ac.th ------------------------------------------------------------------------- คำชี้แจง --------- จงศึกษาข้อมูลและคำสั่งของ Unix ต่อไปนี้ให้เข้าใจ จากนั้นจึงใช้คำสั่งเหล่านี้ช่วยคำนวณหาจำนวน Utilities ในระบบ คำสั่ง wc - print newline, word, and byte counts for each file นิยมเรียกกันว่า word count แสดงจำนวนอักขระขึ้นบรรทัดใหม่ จำนวนคำ และจำนวนไบต์ ของข้อมูลแต่ละแฟ้มที่กำหนด -จำนวนอักขระขึ้นบรรทัดใหม่ หรือ newline คือตัวแทนของจำนวนบรรทัดในแฟ้ม ตัวอย่าง --------- $ wc xx.txt 10 10 110 xx.txt # ข้อมูลในแฟ้ม xx.txt มี 10 บรรทัด 10 คำ 110 ไบต์ $ cat xx.txt | wc # นำ output ของคำสั่ง cat เป็น input ของคำสั่ง wc (word count) 10 10 110 # หรือทำ pipelining ในกรณีที่ต้องการเฉพาะจำนวนบรรทัด ทำได้โดยกำหนด option -l (line) $ cat xx.txt | wc -l 10 ข้อมูล ------- Utilities ของ Unix อยู่ในไดเรกทอรีหลัก 4 ไดเรกทอรีคือ /bin # bin - binary แฟ้มที่มีข้อมูลภายในเป็นเลขฐานสอง /sbin # Utilities สำหรับ superuser /usr/bin /usr/sbin $ ls /bin | wc -l # ส่งรายชื่อแฟ้มที่ได้จากคำสั่ง ls เป็น input ของคำสั่ง wc 149 แสดงว่ารายชื่อแฟ้มใน /bin มีทั้งหมด 149 แฟ้ม หรือมี 149 Utilies Basic calculator ----------------- คำสั่ง bc - An arbitrary precision calculator language bc หรือ basic calculator - เป็นเครื่องคำนวณความแม่นยำสูงของระบบปฏิชบัติการ Unix เป็นเครื่องคำนวณชนิด interactive $ bc # เมื่อเรียกใช้งานจะแสดงข้อความดังนี้ bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. _ # bc พร้อมรับ 'นิพจน์' คณิตศาสตร์จากผู้ใช้ ป้อนนิพจน์คณิตศาสตร์ดังนี้ 12 + (7 - 4) * 12 48 # ผลลัพธ์ของนิพจน์ - สามารถใช้วงเล็บจัดลำดับความสำคัญได้ 12.5 * 3 37.5 # bc สามารถทำการบวก ลบ และคูณ จำนวนเต็มและจำนวนจริงได้ 22/7 3 # แต่การหารทำได้เฉพาะการหารจำนวนเต็ม (interger division หรือ div) 22%7 1 # modulus หรือ mod # การเลิกการทำงานของ bc ทำได้โดยใช้คำสั่ง quit quit $ หากต้องการใช้สามารถ "หาร" จำนวนจริงได้ ต้องเรียกใช้ basic calculator โดย link กับ standard math library ของภาษา C โดยใช้ option -l (Define the standard math library) $ bc -l 22/7 3.14285714285714285714 ปฏิบัติการ 1. จากข้อมูลและคำสั่งดังกล่าวข้างต้น จงแสดงลำดับการทำงานเพื่อนับจำนวน Utilities ทั้งหมดในระบบ 2. จำนวน Utilities ใน /bin, /sbin, /usr/bin, และ /usr/sbin มีจำนวนรวมกันทั้งสิ้น ... ... ... ... 3. นอกจาก bc (basic calculator) แล้ว ระบบปฏิบัติการ Unix ยังมี Utilities อื่นที่ทำหน้าที่เป็นเครื่องคำนวณอีกหรือไม่? จะหาคำตอบได้อย่างไร? ตอนที่ ๔ การดำเนินการกับแฟ้มและไดเรกทอรี -------------------------------------------------- $ ls -al total 8 drwx------ 2 jira staff 4096 ??.???. 3 12:10 . # ไดเรกทอรีปัจจุบัน drwx--x--x 55 jira staff 4096 ??.???. 3 12:01 .. # parent directory สร้าง directory ตามโครงสร้างต่อไปนี้ 886326 | +-----------------+-----------------+------------------+-----------+---------+----- | | | | | H K xx.txt yy.txt ... ... | | +---------+-----------+-+-------+---------+ +----+----+ | | | | | | | A B C D E F G เมื่อสร้าง directory ตามโครงสร้างที่กำหนดเสร็จแล้ว 1. ทำการคัดลอกแฟ้ม xx.txt ไปยังไดเรกทอรี A, C, D, F, และ H 2. ทำการคัดลอกแฟ้ม yy.txt ไปยังไดเรกทอรี B, C, E, G, และ K 3. แฟ้มที่อยู่ในไดเรกทอรี H และ K ให้เจ้าของและกลุ่มมีสิทธิ read และ write ผู้ใช้อื่นในระบบมีสิทธิเฉพาะ read 4. แฟ้มที่อยู่ในไดเรกทอรี A, B, C, D และ E ให้เจ้าของมีสิทธิ read และ write กลุ่มมีสิทธิเฉพาะ read ผู้ใช้อื่นในระบบไม่มีสิทธิใดเลย 5. แฟ้มที่อยู่ในไดเรกทอรี F และ G ให้เจ้าของมีสิทธิเฉพาะ read กลุ่มและผู้ใช้ไม่มีสิทธิใดเลย 6. แฟ้มที่มีสิทธิตามข้อ 5 เจ้าของสามารถ "ลบ" แฟ้มได้หรือไม่? อย่างไร? 7. การกำหนดสิทธิในการใช้งานแฟ้มตามข้อ 5 น่าจะมีประโยชน์ใด