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”:

sh/packages.sh

​ 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 ทางเลือกจะรับมือกับมันได้ดีกว่าหรือไม่ครับ