| Topic 17 | ลูกเล่นของ Shell |
|---|
ช่างไม้ทุกคนต้องการโต๊ะทำงาน (workbench) ที่ดี แข็งแรง และเชื่อถือได้ ไว้สำหรับยึดชิ้นงานในระดับความสูงที่เหมาะสมระหว่างการขึ้นรูป โต๊ะทำงานนี้จะกลายเป็นศูนย์กลางของโรงงานไม้ ที่ช่างจะกลับมาใช้ซ้ำแล้วซ้ำเล่าขณะที่ชิ้นงานค่อย ๆ เป็นรูปเป็นร่างขึ้นมา
สำหรับ Programmer ที่ทำงานกับไฟล์ Text แล้ว โต๊ะทำงานของเราก็คือ Command Shell นั่นเอง จาก Shell Prompt คุณสามารถเรียกใช้เครื่องมือทั้งหมดที่คุณมี และใช้ Pipe เชื่อมต่อเครื่องมือเหล่านั้นเข้าด้วยกันในรูปแบบที่นักพัฒนาดั้งเดิมของมันคาดไม่ถึงเลยด้วยซ้ำ จาก Shell คุณสามารถเปิดใช้งาน Application, Debugger, Browser, Editor และ Utility ต่าง ๆ ได้ คุณสามารถค้นหาไฟล์ ตรวจสอบสถานะของระบบ และกรอง Output ได้ และด้วยการเขียนโปรแกรมให้กับ Shell คุณยังสามารถสร้าง Macro Command ที่ซับซ้อนสำหรับงานที่คุณทำเป็นประจำได้อีกด้วย
สำหรับ Programmer ที่เติบโตมากับ GUI Interface และ Integrated Development Environment (IDE) มุมมองนี้อาจดูสุดโต่งไปสักหน่อย ก็ในเมื่อคุณสามารถทำทุกอย่างได้ดีพอ ๆ กันด้วยการชี้แล้วคลิกไม่ใช่หรือ?
คำตอบง่าย ๆ ก็คือ “ไม่ใช่” GUI Interface นั้นยอดเยี่ยม และมันสามารถทำงานได้เร็วกว่าและสะดวกกว่าสำหรับการทำงานง่าย ๆ บางอย่าง การย้ายไฟล์ การอ่านและเขียนอีเมล รวมถึงการ Build และ Deploy โปรเจกต์ของคุณ ล้วนเป็นสิ่งที่คุณอาจอยากทำผ่าน Graphical Environment แต่ถ้าคุณทำงานทั้งหมดโดยใช้ GUI เพียงอย่างเดียว คุณก็กำลังพลาดความสามารถเต็มรูปแบบของ Environment ของคุณไป คุณจะไม่สามารถ Automate งานทั่วไป หรือใช้พลังเต็มที่ของเครื่องมือที่คุณมีอยู่ได้ และคุณก็จะไม่สามารถรวมเครื่องมือต่าง ๆ เข้าด้วยกันเพื่อสร้าง macro tools ของคุณเองได้ ข้อดีอย่างหนึ่งของ GUI คือ WYSIWYG —เห็นอย่างไรก็ได้อย่างนั้น ส่วนข้อเสียก็คือ WYSIAYG —สิ่งที่คุณเห็นคือ ทั้งหมด ที่คุณจะได้ครับ
โดยทั่วไปแล้ว GUI Environment จะถูกจำกัดอยู่แค่ความสามารถที่ผู้ออกแบบตั้งใจไว้เท่านั้น หากคุณต้องการทำอะไรที่เกินไปจาก Model ที่ผู้ออกแบบกำหนดไว้ คุณมักจะหมดหนทาง—และบ่อยครั้งกว่านั้น คุณ ต้อง ทำอะไรที่เกินกว่า Model นั้นจริง ๆ Pragmatic Programmer ไม่ได้แค่เขียนโค้ด พัฒนา Object Model เขียนเอกสาร หรือ Automate กระบวนการ Build เท่านั้น—แต่เราทำ ทุกอย่าง เหล่านี้เลย ขอบเขตของเครื่องมือแต่ละตัวมักจะถูกจำกัดอยู่แค่งานที่เครื่องมือนั้นถูกออกแบบมาให้ทำ ยกตัวอย่างเช่น สมมติว่าคุณต้องการรวม Code Preprocessor (เพื่อ Implement Design-by-Contract หรือ Multi-processing Pragma หรืออะไรทำนองนั้น) เข้ากับ IDE ของคุณ หากผู้ออกแบบ IDE ไม่ได้เตรียม Hook ไว้ให้สำหรับความสามารถนี้โดยชัดเจน คุณก็ทำไม่ได้
| Tip 26 | ใช้พลังของ Command Shell ให้เต็มที่ |
|---|
ทำความคุ้นเคยกับ Shell แล้วคุณจะพบว่า Productivity ของคุณพุ่งทะยานขึ้นอย่างเห็นได้ชัด ต้องการสร้างรายการชื่อ Package ที่ไม่ซ้ำกันทั้งหมดที่ถูก Import เข้ามาอย่างชัดเจนในโค้ด Java ของคุณไหม? โค้ดด้านล่างนี้จะเก็บผลลัพธ์นั้นไว้ในไฟล์ชื่อ “list”:
| | grep '^import ' * .java | |
|---|---|
| | sed -e 's/.import //' -e 's/;.*$//' | |
| | sort -u >list |
หากคุณยังไม่เคยใช้เวลาสำรวจความสามารถของ Command Shell บนระบบที่คุณใช้งานมากนัก เรื่องนี้อาจดูน่ากลัวไปสักหน่อย แต่ถ้าคุณลงทุนเวลาทำความคุ้นเคยกับ Shell ของคุณ ทุกอย่างจะเริ่มเข้าที่เข้าทางในไม่ช้า ลองเล่นกับ Command Shell ของคุณดู แล้วคุณจะแปลกใจว่ามันช่วยเพิ่ม Productivity ให้คุณได้มากแค่ไหน
A Shell of Your Own (Shell ในแบบของคุณเอง)
เช่นเดียวกับที่ช่างไม้จะปรับแต่งพื้นที่ทำงานของตัวเอง Developer ก็ควรปรับแต่ง Shell ของตัวเองเช่นกัน ซึ่งโดยทั่วไปก็รวมถึงการเปลี่ยน Configuration ของโปรแกรม Terminal ที่คุณใช้ด้วย
การปรับแต่งที่พบได้บ่อย ได้แก่:
-
การตั้งค่า Color Theme คุณอาจใช้เวลาหลายชั่วโมงลองไล่ดู ทุก ๆ Theme ที่มีให้ดาวน์โหลดออนไลน์สำหรับ Shell ของคุณ
-
การตั้งค่า Prompt . Prompt ที่บอกว่า Shell พร้อมให้คุณพิมพ์คำสั่งแล้วนั้น สามารถตั้งค่าให้แสดงข้อมูลแทบทุกอย่างที่คุณต้องการได้ (รวมถึงข้อมูลอีกหลายอย่างที่คุณไม่มีวันอยากเห็นด้วย) เรื่องนี้ขึ้นอยู่กับความชอบส่วนตัวล้วน ๆ ส่วนตัวเราเองชอบ Prompt แบบเรียบง่าย ที่แสดงชื่อ Directory ปัจจุบันแบบย่อ สถานะ Version Control และเวลา
-
Alias และ Shell Function . ทำให้ Workflow ของคุณง่ายขึ้นด้วยการเปลี่ยนคำสั่งที่คุณใช้บ่อย ๆ ให้กลายเป็น Alias ง่าย ๆ บางทีคุณอาจต้องอัปเดตเครื่อง Linux ของคุณเป็นประจำ แต่จำไม่ได้เลยว่าต้อง update แล้ว upgrade หรือ upgrade แล้ว update กันแน่ ลองสร้าง Alias ขึ้นมาสิ:
| | alias apt-up= 'sudo apt-get update && sudo apt-get upgrade' |
| --- | --- |
หรือบางทีคุณอาจเผลอลบไฟล์ด้วยคำสั่ง rm บ่อยเกินไปจนเกินพอดี ลองเขียน Alias ให้มันถามยืนยันทุกครั้งในอนาคต:
| | alias rm = 'rm -iv' |
| --- | --- |
- Command Completion . Shell ส่วนใหญ่จะช่วยเติมชื่อคำสั่งและไฟล์ให้อัตโนมัติ: แค่พิมพ์ตัวอักษรสองสามตัวแรก กด Tab แล้วมันจะเติมส่วนที่เหลือให้เท่าที่ทำได้ แต่คุณสามารถทำได้มากกว่านั้นอีก ด้วยการตั้งค่า Shell ให้จดจำคำสั่งที่คุณกำลังพิมพ์และเสนอ Completion ที่เหมาะกับ Context นั้น ๆ บาง Shell ยังปรับ Completion ให้เปลี่ยนไปตาม Directory ปัจจุบันได้อีกด้วย
คุณจะใช้เวลาส่วนใหญ่อยู่กับ Shell เหล่านี้ ดังนั้นจงเป็นเหมือนปูเสฉวน และทำให้มันกลายเป็นบ้านของคุณเองครับ
Related Sections Include (หัวข้อที่เกี่ยวข้อง)
- Topic 13, Prototypes and Post-it Notes
- Topic 16, The Power of Plain Text
- Topic 21, Text Manipulation
- Topic 30, Transforming Programming
- Topic 51, Pragmatic Starter Kit
Challenges (ความท้าทาย)
-
มีอะไรบ้างไหมที่ตอนนี้คุณยังทำด้วยมือผ่าน GUI อยู่? คุณเคยต้องบอกขั้นตอนให้เพื่อนร่วมงานทำตามแบบ “คลิกปุ่มนี้” “เลือกรายการนี้” ทีละขั้นตอนบ้างไหม? สิ่งเหล่านี้ Automate ได้หรือเปล่า?
-
ทุกครั้งที่คุณย้ายไปทำงานใน Environment ใหม่ อย่าลืมตั้งใจสำรวจดูว่ามี Shell อะไรให้ใช้บ้าง และลองดูว่าคุณจะพก Shell ปัจจุบันของคุณติดตัวไปด้วยได้หรือไม่
-
ลองสำรวจดู Shell ทางเลือกอื่น ๆ นอกเหนือจาก Shell ที่คุณใช้อยู่ หากเจอปัญหาที่ Shell ของคุณแก้ไม่ได้ ลองดูว่า Shell ทางเลือกจะรับมือกับมันได้ดีกว่าหรือไม่ครับ