แงๆ .. ถูกดองไว้ที่ debianclub.org ท่าน moderator ไม่ตีพิมพ์ให้สักที เอามาลงบล็อกตัวเองละกันครับ .. เขียนยังไม่ค่อยดี แต่ลองอ่านดู เผื่อมีประโยชน์
---
ผมเขียนบทความนี้ด้วยเจตนาอยากให้มีผู้อ่านหลายระดับ จึงขออภัยหากภาษาที่ใช้ดูฟุ่มเฟือยและอ่อนกำลัง
ลินุกซ์ในความหมายที่แท้จริง เป็นเพียง OS Kernel ที่ทำหน้าที่จัดสรรทรัพยากรต่างๆ ของระบบ ไม่สะดวกที่จะนำมาใช้งานโดยตรง เหล่านักพัฒนาจึงได้สร้างระบบติดต่อ (interactive system) ขึ้นมาครอบลินุกซ์เคอร์เนลเพื่อให้สามารถใช้งานได้สะดวกขึ้น สถาปัตยกรรมลินุกซ์ในปัจจุบันแบ่งออกได้เป็น 4 ระดับชั้น คือ kernel > shell > window manager > desktop environment
สำหรับผู้ใช้ลินุกซ์ก่อนยุค Ubuntu แน่นอนว่าการใช้งาน shell คือสิ่งที่จำเป็นที่สุด แต่กับผู้ใช้หน้าใหม่ที่เพิ่งใช้งานลินุกซ์ครั้งแรกด้วย Ubuntu ดูเหมือนว่า shell แทบจะหมดความสำคัญลงไป ... แต่พึงตระหนักว่าการใช้ลินุกซ์โดยไม่ใช้ shell คือการเสียผลประโยชน์อย่างมหาศาล การไปเชียงใหม่โดยไม่ได้ขึ้นไปนมัสการพระธาตุดอยสุเทพ เปรียบเสมือนไปไม่ถึงเชียงใหม่ฉันใด การใช้ลินุกซ์โดยไม่ใช้ shell ก็เหมือนไม่ได้ใช้ลินุกซ์ฉันนั้น
ต้องขอออกตัวว่าผมเติบโตมาในยุคของ BASH (Bourne-Again Shell) และ Gnome บทความนี้จึงใช้การอ้างอิงจาก BASH และ Gnome Terminal เป็นหลักนะครับ
ก้าวแรก:
shell คือโปรแกรมที่ทำหน้ารับคำสั่งจากผู้ใช้ไปส่งให้เคอร์เนล การติดต่อกับ shell จะติดต่อผ่านโปรแกรมเทอร์มินัลอีกที สำหรับผู้ใช้ Gnome เข้าไปที่ Applications > Accessories > Terminal เมื่อเข้าสู่เทอร์มินัลจะพบกับข้อความลักษณะต่อไปนี้ tonkla@myhost:~$ นั่นหมายถึง shell พร้อมรับคำสั่งแล้ว สามารถดูค่าที่กำหนดรูปแบบการแสดงผลของข้อความ โดยใช้คำสั่ง
$ echo $PS1
ถ้าเป็นลินุกซ์ตระกูล Debian จะได้ผลลัพธ์เป็น
${debian_chroot:+($debian_chroot)}\u@\h:\w\$
\u คือชื่อผู้ใช้
\h, \H คือชื่อโฮสต์
\w คือพาธ (path) ของไดเรคทอรีแบบเต็ม (/a/b/c/d/e)
\W คือพาธเฉพาะไดเรคทอรีปัจจุบัน (/e)
ตัวอย่างการเปลี่ยนแปลงรูปแบบการแสดงผลโดยใช้คำสั่ง export
$ export PS1='\H [\W] >'
การเดินทางไปบนถนนสาย "directory":
ตำแหน่งไดเรคทอรีเริ่มต้นเมื่อเข้าสู่เทอร์มินัลคือ Home Directory ของผู้ใช้แต่ละคน การย้ายตำแหน่งไปยังไดเรคทอรีอื่นๆ จะใช้คำสั่ง cd (change directory) ตามด้วยไดเรคทอรีที่ต้องการไป
ดูเนื้อหาภายในไดเรคทอรีปัจจุบันด้วยคำสั่ง ls (list directory contents)
$ ls
อยู่ที่เดิม
$ cd .
ออกไปไดเรคทอรีชั้นนอก 1 ชั้น
$ cd ..
ออกไปไดเรคทอรีชั้นนอก 2 ชั้น
$ cd ../..
สลับไปมาระหว่างสองไดเรคทอรีที่เข้าถึงล่าสุด (ไดเรคทอรีที่เก็บไว้ในตัวแปร $PWD และ $OLDPWD)
$ cd -
กลับบ้าน
$ cd
การใช้งาน cd ในระดับที่สูงขึ้น จะเล่นกับค่าในตัวแปร $CDPATH ยกตัวอย่างเช่น เรามี /a/b/c
ถ้าใช้คำสั่ง
$ export CDPATH=.:/a/b
ในกรณีที่อยู่บ้าน (home) แล้วต้องการไปยัง c จะใช้คำสั่งสั้นๆ เพียง
$ cd c
กด Tab ช่วยเติมเต็ม:
เคยเห็นผู้ใช้มือใหม่หลายๆ ท่าน พิมพ์ชื่อไดเรคทอรีหรือคำสั่งต่างๆ จนครบทุกตัวอักษร ยิ่งชื่อยาวๆ ยิ่งน่าสงสาร มีวิธีง่ายๆ ครับ พิมพ์ไปด้วย กดปุ่มแท็บไปด้วย ถ้าเจอ มันจะเติมเต็มให้อัตโนมัติ (auto-complete) โดยกดแท็บหนึ่งครั้งสำหรับเติมเต็ม ถ้ามีชื่อที่สามารถเป็นไปได้มากกว่าหนึ่ง ระบบจะนิ่งไป ให้กดอีกครั้งหนึ่ง ระบบจะแสดงชื่อที่เป็นไปได้ทั้งหมดให้ดู เราก็พิมพ์ไป แท็บไปเรื่อยๆ .. มือใหม่อ่านแล้วงงล่ะสิ ต้องไปลองทำนะครับ
ย่อคำสั่งด้วยคำสั่ง alias:
เคยเห็นผู้ใช้มือใหม่อีกเช่นกัน เวลาจะดูเนื้อหาในไดเรคทอรีแบบแสดงรายละเอียด จะใช้คำสั่ง
$ ls -l
แต่ถ้าคำสั่งนี้ต้องใช้บ่อยๆ พิมพ์ยาวๆ แบบนี้ก็คงไม่ใช่เรื่องสนุกเท่าไหร่ ดังนั้นเราจะย่อให้เหลือสั้นๆ โดยการ
$ alias ll='ls -l'
ต่อไปก็แค่พิมพ์
$ ll
สิ่งที่ซ่อนอยู่:
จากตัวอย่างข้างบน คำสั่ง export หรือ alias ทั้งหลาย จะมีผลเฉพาะเทอร์มินัลที่ป้อนคำสั่งเข้าไปชั่วคราวเท่านั้น พอปิดเครื่องค่าทุกอย่างก็จะอันตรธานหายไป ถ้าต้องการให้ค่านี้มีผลถาวร ต้องทำอย่างไร?
ระบบไฟล์ของลินุกซ์จะใช้จุด . (ขออภัยครับ จำชื่อภาษาไทยสวยๆ ไม่ได้) นำหน้าไฟล์หรือไดเรคทอรีที่ต้องการซ่อน หากต้องการให้ปรากฏต้องใช้คำสั่ง
$ ls -a
เมื่อลอง ls -a ใน home directory ดู จะพบว่ามีไฟล์และไดเรคทอรีปรากฏมากมาย ส่วนใหญ่จะเป็นไฟล์คอนฟิกกูเรชันสำหรับเก็บค่าต่างๆ ของผู้ใช้ไว้ ไฟล์ที่สำคัญต่อการทำงานของ BASH มี 4 ไฟล์ คือ .bash_history .bash_logout .bashrc และ .profile
การจะให้ค่าต่างๆ มีผลอย่างถาวร ต้องไปเขียนใส่ไว้ในไฟล์ .bashrc หรือ .profile ลองเปิดดูด้วย text editor ที่ชอบครับ แล้วจะเข้าใจดีขึ้น
ความแตกต่างระหว่างการใส่ไว้ใน .bashrc และ .profile คือ
.profile จะให้ผลทันทีที่ล็อกอินเข้าระบบ ตัวอย่างคำสั่งเช่น xrandr เป็นคำสั่งที่ใช้สั่งให้ output ออก 2 จอภาพ ถ้าใส่ไว้ใน .profile จะมีผลทันทีที่ผ่าน GDM Login เข้ามา ส่วน .bashrc จะให้ผลช้ากว่า ต้องมี activity อะไรสักอย่างกับระบบก่อน ค่าปรับแต่งใน .bashrc ถึงจะทำงาน
reuse คำสั่งด้วย history:
คำสั่งต่างๆ ที่ถูกพิมพ์ลงไปในเทอร์มินัลและกด Enter แล้ว จะถูกเก็บไว้อยู่ในไฟล์ .bash_history คงจะดีไม่น้อย ถ้าหากเราสามารถเรียกใช้คำสั่งยาวๆ เหล่านั้นได้อีกครั้งโดยไม่ต้องพิมพ์ใหม่
ดู 100 คำสั่งที่ใช้ล่าสุด
$ history 100
เรียกใช้คำสั่งล่าสุด
$ !!
เรียกใช้คำสั่งที่ 50
$ !50
เรียกใช้คำสั่งล่าสุดที่ขึ้นต้นด้วย xxx
$ !xxx
เรียกใช้คำสั่งล่าสุดที่ประสมด้วย yyy (เช่น $ cd /aaa/bbb/ccc/ddd/eee/fff/xxx/yyy)
$ !?yyy
สามารถดูรายละเอียดเพิ่มเติมได้จาก history manual
$ man history
วิ่งผลัดด้วยสัญลักษณ์ | (pipe):
| คือสัญลักษณ์ที่ใช้เป็นตัวส่งผ่านผลลัพธ์ (output) ของคำสั่งแรก ไปเป็นวัตถุดิบ (input) ของคำสั่งต่อไป เช่น
$ ls -l | grep xxx | more
หมายถึง แสดงผลเนื้อหาในไดเรคทอรีแบบแถวรายละเอียด โดยกรองเอาเฉพาะบรรทัดที่ประสมด้วย xxx และถ้าผลลัพธ์มียาวเกิน 1 หน้าจอ ให้แสดงทีละหน้าจอ
รวบหัวรวบหางด้วย ; (semi-colon):
ปกติเมื่อเข้าไปในไดเรคทอรีอื่นแล้ว เรามักจะล้างหน้าจอ และขอดูรายละเอียดเนื้อหาในไดเรคทอรีใหม่นั้นเสมอ เช่น
$ cd xxx
$ clear
$ ls
จากตัวอย่างเราต้องกด Enter ถึง 3 ครั้ง จะดีกว่าไหมถ้ากด Enter แค่ครั้งเดียว (แต่กดคีย์อื่นแทนอีก 2 ครั้ง -_-')
$ cd xxx;clear;ls
input/output ง่ายๆ ด้วยเครื่องหมาย '>' / '<' :
$ cat > sample.txt
aaa
bbb
Ctrl+z
จากคำสั่งข้างต้น เราจะได้ไฟล์ sample.txt ที่มีเนื้อหา aaa(\n)bbb อยู่ข้างใน (กด Ctrl+z เพื่อบอกว่าจบการเขียน)
(ผมลอง $ echo aaa\\nbbb > sample.txt มันไม่ขึ้นบรรทัดใหม่ให้แฮะ ทำอย่างไรถึงจะขึ้นบรรทัดใหม่ด้วยคำสั่ง echo ได้ครับ?)
ใช้คีย์ลัด:
Ctrl+l : Clear Screen
Ctrl+u : Undo Typing
Ctrl+c : Cancel Task
Ctrl+d : Exit
ฯลฯ
นึกออกเพียงเท่านี้ครับ ท่านใดนึก trick เล็กๆ น้อยๆ ออก ก็อย่าลืมแบ่งปันกันบ้างนะครับ
อ้างอิง:
http://www.afp548.com/article.php?story=20070525141734763&mode=print
http://www.softpanorama.org/Scripting/Shellorama/command_history_reuse.s...