เรียนรู้การทำงานพื้นฐานพร้อมเปรียบเทียบความแตกต่างระหว่าง Fish และ Bash
ในการสร้างเว็บ สิ่งที่ขาดไม่ได้เลยก็คือ "หน้าจอสีดำ" หรือการใช้คำสั่งในเทอร์มินัล (เชลล์) หลายคนคงคุ้นเคยกับการใช้ "Bash" ซึ่งเป็นเชลล์พื้นฐานที่ติดมากับระบบปฏิบัติการโดยไม่รู้ตัว แต่ในโลกนี้ยังมีเชลล์ที่มีฟังก์ชันสูงกว่าและช่วยให้การทำงานของเรามีประสิทธิภาพขึ้นอย่างมาก และตัวแทนของเชลล์เหล่านั้นก็คือ "Fish (Friendly Interactive Shell)" ที่เราจะมาแนะนำกันในวันนี้
ในบทความนี้ เราจะเปรียบเทียบ Fish กับ "Bash" ที่เป็นที่นิยมที่สุด พร้อมอธิบายวิธีการใช้งานพื้นฐานไปจนถึงฟังก์ชันที่น่าสนใจอย่างละเอียด เพื่อเป็นก้าวแรกให้เหล่าเว็บครีเอเตอร์ได้มีชีวิตการเขียนโค้ดที่สะดวกสบายยิ่งขึ้น โค้ดทั้งหมดถูกสร้างขึ้นมาเพื่อให้สามารถทำงานได้อย่างสมบูรณ์เพียงแค่คัดลอกและวาง มาเริ่มต้นสำรวจโลกของ Fish ไปพร้อมๆ กับการสะสมประสบการณ์ความสำเร็จเล็กๆ น้อยๆ จากการที่โค้ด "ทำงานได้!" กันเถอะครับ
Fish กับ Bash ต่างกันอย่างไร? มาทำความรู้จักพื้นฐานของเชลล์กัน
ก่อนอื่น เรามาทำความเข้าใจคุณสมบัติเด่นของแต่ละเชลล์กันก่อน
- Bash (Bourne Again SHell): เป็นเชลล์ "มาตรฐานวงการ" ที่ติดตั้งมาเป็นค่าเริ่มต้นใน Linux หลายๆ ดิสทริบิวชันและ macOS (เวอร์ชันเก่า) มีประวัติศาสตร์ยาวนาน และตัวอย่างคำสั่งส่วนใหญ่ที่พบบนอินเทอร์เน็ตก็เขียนขึ้นสำหรับ Bash มีจุดเด่นที่ความเสถียรและเป็นที่ยอมรับ แต่ในด้านฟังก์ชันการทำงานก็อาจจะดูเก่าไปบ้าง
- Fish (Friendly Interactive Shell): ตามชื่อเลยครับ Fish ถูกพัฒนาขึ้นมาโดยมีเป้าหมายเพื่อเป็น "เชลล์ที่เป็นมิตรและโต้ตอบได้" จุดเด่นที่สุดคือฟังก์ชันการเติมคำสั่งอัตโนมัติ (auto-completion) และการเน้นสี синтаксис (syntax highlighting) ที่ทรงพลังโดยไม่ต้องตั้งค่าใดๆ ทำให้แม้แต่มือใหม่ก็สามารถใช้งานได้อย่างง่ายดาย เป็นเชลล์ที่ชาญฉลาดและเข้ากับสภาพแวดล้อมการพัฒนาสมัยใหม่ได้เป็นอย่างดี
ถ้าจะเปรียบเทียบ Bash ก็เหมือนกับ "เครื่องจักรเก่าแก่ที่ไว้ใจได้ แต่ต้องสั่งงานตามคู่มือเป๊ะๆ" ส่วน Fish ก็เปรียบได้กับ "ผู้ช่วย AI อัจฉริยะที่คาดเดาความต้องการของเราและคอยช่วยเหลือ" งั้นเรามาดูความสามารถของมันกันเลยดีกว่าครับ
【ปฏิบัติ】นี่คือจุดที่แตกต่าง! เปรียบเทียบการทำงานพื้นฐานของ Fish และ Bash อย่างละเอียด
จากนี้ไป เราจะมาลองสัมผัสฟังก์ชันที่สะดวกสบายของ Fish ผ่านการเปรียบเทียบการทำงานจริง สำหรับใครที่ยังไม่ได้ติดตั้ง Fish ก็สามารถติดตั้งตามสภาพแวดล้อมของตัวเองได้เลย
สำหรับ macOS (Homebrew):
brew install fish
สำหรับ Ubuntu/Debian:
sudo apt-get update
sudo apt-get install fish
หลังจากติดตั้งเสร็จแล้ว พิมพ์ `fish` ในเทอร์มินัลของคุณเพื่อเริ่มต้นใช้งาน Fish shell ได้เลย
1. หน้าตาและปริมาณข้อมูลที่แตกต่าง! เปรียบเทียบพรอมต์
สิ่งแรกที่คุณจะเห็นเมื่อเปิดเชลล์ขึ้นมาก็คือ "พรอมต์" (prompt) ซึ่งเป็นส่วนด้านซ้ายมือที่คุณใช้พิมพ์คำสั่ง ซึ่งจุดนี้เองก็มีความแตกต่างที่ชัดเจนระหว่าง Bash และ Fish แล้ว
พรอมต์ทั่วไปของ Bash:
จะแสดงชื่อผู้ใช้ ชื่อโฮสต์ และไดเรกทอรีปัจจุบัน ซึ่งค่อนข้างเรียบง่าย
user@hostname:~/project$
พรอมต์พื้นฐานของ Fish:
Fish จะแสดงชื่อผู้ใช้และเส้นทางไดเรกทอรีปัจจุบันอย่างชัดเจน โดยเฉพาะอย่างยิ่ง เมื่อคุณอยู่ใน Git repository มันจะแสดงชื่อ branch ให้โดยอัตโนมัติ ซึ่งสะดวกมากสำหรับเว็บครีเอเตอร์ที่ต้องใช้ Git เป็นประจำ การที่เห็นได้ทันทีว่ากำลังทำงานอยู่บน branch ไหนจะช่วยลดความผิดพลาดได้อย่างมาก
user@hostname ~/project (main)>
2. อาวุธสุดยอดของ Fish! การแนะนำคำสั่งอัตโนมัติ (Autosuggestion)
ฟังก์ชันที่ทำให้ Fish ได้รับการขนานนามว่าเป็น "เชลล์เทพ" ก็คือ การแนะนำคำสั่งอัตโนมัติ นี่คือฟังก์ชันที่คาดเดาคำสั่งที่คุณกำลังจะพิมพ์โดยอ้างอิงจากประวัติการใช้งาน แล้วแสดงเป็นตัวอักษรสีเทาจางๆ
ตัวอย่างเช่น หากคุณเคยพิมพ์คำสั่ง `git commit -m "Initial commit"` มาก่อน ครั้งต่อไปเพียงแค่คุณพิมพ์ `git c`...
การแนะนำคำสั่งอัตโนมัติของ Fish:
อย่างที่คุณเห็น คำสั่งทั้งหมดที่คาดเดาจากประวัติจะปรากฏขึ้นมาต่อจากที่คุณพิมพ์ หากต้องการใช้คำสั่งที่แนะนำนี้ ก็เพียงแค่กดปุ่ม → (ลูกศรขวา) หรือ Ctrl + F เพื่อยืนยันคำสั่งทั้งหมด ไม่จำเป็นต้องพิมพ์คำสั่งยาวๆ ซ้ำไปซ้ำมาอีกต่อไป
user@hostname ~/project (main)> git commit -m "Initial commit"
แม้ว่า Bash จะมีฟังก์ชันเติมคำสั่งเช่นกัน แต่โดยปกติแล้วคุณจะต้องกดปุ่ม Tab เพื่อดูรายการตัวเลือก ซึ่งไม่ลื่นไหลและใช้งานง่ายเท่า Fish แค่ประสบการณ์นี้เพียงอย่างเดียวก็คุ้มค่าที่จะเปลี่ยนมาใช้ Fish แล้ว
3. ลดการพิมพ์ผิดได้อย่างมาก! การเน้น синтаксис (Syntax Highlighting)
Fish จะบอกคุณแบบเรียลไทม์ว่าคำสั่งที่คุณกำลังพิมพ์นั้น "ถูกต้องหรือไม่" ด้วยการใช้สีที่แตกต่างกัน ซึ่งเรียกว่า การเน้น синтаксис
กรณีที่เป็นคำสั่งที่ถูกต้อง (เช่น `echo`):
คำสั่งที่ถูกต้องและมีอยู่จริงในระบบจะแสดงเป็นสีฟ้าอ่อนตามค่าเริ่มต้น
echo "Hello World"
กรณีที่เป็นคำสั่งที่ไม่มีอยู่จริง (เช่น พิมพ์ผิดเป็น `ech`):
หากคุณพิมพ์คำสั่งผิดหรือพิมพ์คำสั่งที่ไม่มีอยู่จริง มันจะเปลี่ยนเป็นสีแดงทันที ซึ่งช่วยให้คุณรู้ตัวว่า "อ๊ะ, พิมพ์ผิด!" ก่อนที่จะรันคำสั่ง และป้องกันข้อผิดพลาดที่ไม่จำเป็นได้
ech "Hello World"
ด้วยฟังก์ชันนี้ โอกาสที่คุณจะได้เห็นข้อความแจ้งเตือนที่คุ้นเคยอย่าง "command not found" จากการพิมพ์ผิดก็จะลดลงอย่างมาก
ภาคประยุกต์: วิธีการเขียนสคริปต์แตกต่างกันอย่างไร?
หน้าที่ของเชลล์ไม่ได้มีแค่การโต้ตอบแบบทันทีทันใดเท่านั้น แต่ยังรวมถึงการเขียน "เชลล์สคริปต์" เพื่อทำงานซ้ำๆ โดยอัตโนมัติ ซึ่งในจุดนี้เอง ปรัชญาของ Fish และ Bash ก็แสดงความแตกต่างออกมาเช่นกัน สคริปต์ของ Fish ถูกออกแบบมาให้มี синтаксис ที่ทันสมัยและอ่านง่ายกว่า
1. การกำหนดตัวแปร
ใน Bash:
จะใช้รูปแบบ `ชื่อตัวแปร=ค่า` และมีกฎเฉพาะตัวคือห้ามมีช่องว่างรอบๆ เครื่องหมายเท่ากับ
MY_PROJECT="My Awesome Site"
echo $MY_PROJECT
ใน Fish:
จะใช้คำสั่ง `set` ในการกำหนดตัวแปร ทำให้เห็นชัดเจนว่ากำลังทำอะไรอยู่ และเนื่องจากเป็นการส่งค่าเป็นอาร์กิวเมนต์ จึงไม่ต้องกังวลเรื่องช่องว่างอีกต่อไป
set MY_PROJECT "My Awesome Site"
echo $MY_PROJECT
2. คำสั่ง if (การแยกเงื่อนไข)
ในการสร้างเว็บ เรามักจะใช้การแยกเงื่อนไข เช่น "ถ้ามีไฟล์ `package.json` ให้รัน `npm install`"
ใน Bash:
มักจะใช้รูปแบบที่ค่อนข้างเก่าอย่าง `[` (คำสั่ง test) หรือ `[[` และต้องใช้คีย์เวิร์ดอย่าง `; then` และ `fi`
if [ -f "package.json" ]; then
echo "เจอไฟล์ package.json แล้ว!"
fi
ใน Fish:
สามารถเขียนได้ง่ายเหมือนภาษาโปรแกรมมิ่งอื่นๆ โดยเขียนเงื่อนไขต่อท้าย `if` ได้เลย และปิดบล็อกด้วย `end` ไม่จำเป็นต้องใช้ `then` หรือ `;` ทำให้โค้ดดูสะอาดตาขึ้น
if test -f "package.json"
echo "เจอไฟล์ package.json แล้ว!"
end
3. ลูป for (การทำงานซ้ำ)
การทำงานซ้ำๆ เช่น การประมวลผลไฟล์หลายๆ ไฟล์พร้อมกัน ก็เป็นสิ่งที่ใช้บ่อยเช่นกัน
ใน Bash:
จะสร้างลูปด้วยการผสมผสานคีย์เวิร์ด `for`, `in`, `do`, `done`
for i in {1..3}; do
echo "Bash loop count: $i"
done
ใน Fish:
เช่นเดียวกับ `if` คือมี синтаксис ที่เรียบง่าย ไม่ต้องใช้ `do` และปิดบล็อกด้วย `end` ส่วนที่อยู่ในวงเล็บ `()` เรียกว่า "การแทนที่คำสั่ง" (command substitution) ซึ่งจะนำผลลัพธ์ของคำสั่งมาใช้เป็นลิสต์
for i in (seq 1 3)
echo "Fish loop count: $i"
end
ข้อควรระวังในการย้ายมาใช้ Fish
แม้ว่าเราจะได้เห็นเสน่ห์ของ Fish กันไปแล้ว แต่ก็มี "ข้อควรระวัง" บางอย่างที่ควรรู้ก่อนย้ายมาใช้งาน การทำความเข้าใจสิ่งเหล่านี้จะช่วยให้คุณเริ่มต้นชีวิตกับ Fish ได้อย่างราบรื่น
1. ความไม่เข้ากันของ синтаксис กับ Bash
จากที่เห็นมา Fish เน้นความสามารถในการอ่านสคริปต์ ทำให้มันไม่สามารถเข้ากันได้กับ Bash อย่างสมบูรณ์ โดยเฉพาะอย่างยิ่งเวลาที่คุณคัดลอกคำสั่งสำหรับ Bash จากอินเทอร์เน็ตมาใช้
การเชื่อมคำสั่ง (`&&`, `||`)
ใน Bash เรามักจะใช้ `&&` เพื่อเขียนเงื่อนไขว่า "ถ้าคำสั่งก่อนหน้าสำเร็จ ให้ทำคำสั่งถัดไป"
# สร้างไดเรกทอรี และถ้าสำเร็จ ให้เข้าไปในไดเรกทอรีนั้น
mkdir my_dir && cd my_dir
ใน Fish จะใช้คีย์เวิร์ดที่ชัดเจนกว่าอย่าง `and` (แม้ว่า Fish เวอร์ชันใหม่ๆ จะใช้ `&&` ได้ แต่โดยทางการแล้วแนะนำให้ใช้ `and` หรือ `;`)
# การเขียนแบบ Fish
mkdir my_dir; and cd my_dir
ในทำนองเดียวกัน `||` ของ Bash (ถ้าคำสั่งก่อนหน้าล้มเหลว ให้ทำคำสั่งถัดไป) จะเท่ากับ `or` ใน Fish หากคุณเจอว่า "คำสั่ง Bash ใช้ไม่ได้!" ให้ลองนึกถึงความแตกต่างนี้ดูครับ
2. วิธีการตั้งค่าตัวแปรสภาพแวดล้อม
"ตัวแปรสภาพแวดล้อม" (Environment Variable) ที่เราใช้ตั้งค่า path ของเครื่องมือต่างๆ ก็มีวิธีการตั้งค่าที่แตกต่างกัน
ใน Bash (เขียนใน `~/.bash_profile` เป็นต้น):
จะใช้คำสั่ง `export` ในการตั้งค่าตัวแปรสภาพแวดล้อม
export NODE_ENV="development"
ใน Fish (เขียนใน `~/.config/fish/config.fish`):
จะใช้คำสั่ง `set` พร้อมกับแฟล็ก `-x` หรือ `--export` ซึ่งจะทำให้ตัวแปรนั้นถูกส่งต่อไปยังโปรเซสลูก (child process) ด้วย
set -x NODE_ENV "development"
โดยเฉพาะการเพิ่ม path ใหม่เข้าไปในตัวแปร `PATH` ใน Fish จะมีวิธีเขียนที่พิเศษเล็กน้อย `$PATH` จะถูกมองว่าเป็นลิสต์ (array) ทำให้เราสามารถเพิ่มเข้าไปได้อย่างง่ายดายดังนี้
# เพิ่ม ~/.node_modules/bin ไปไว้ข้างหน้าสุดของ PATH
set -x PATH ~/.node_modules/bin $PATH
คุณไม่จำเป็นต้องเชื่อมสตริงด้วยเครื่องหมายโคลอน `:` เหมือนใน Bash ทำให้สามารถจัดการ path ได้อย่างปลอดภัยและง่ายดายกว่า
สรุป: มาเริ่มใช้ Fish กันเถอะ!
ในบทความนี้ เราได้เปรียบเทียบเชลล์มาตรฐานอย่าง Bash กับเชลล์ยุคใหม่อย่าง "Fish" พร้อมทั้งอธิบายวิธีใช้งานพื้นฐานและเสน่ห์ของมัน
สรุปข้อดีของ Fish:
- 🧠 การแนะนำคำสั่งอัตโนมัติที่ชาญฉลาด: เพิ่มความเร็วและประสิทธิภาพในการพิมพ์คำสั่งอย่างมาก
- 🎨 การเน้น синтаксис: ตรวจจับการพิมพ์ผิดแบบเรียลไทม์ ป้องกันข้อผิดพลาดล่วงหน้า
- 📖 синтаксис สคริปต์ที่อ่านง่าย: ใช้คีย์เวิร์ดที่เข้าใจง่าย เช่น `set`, `and`, `or`, `end`
- 🚀 พร้อมใช้งานทันทีโดยไม่ต้องตั้งค่า: ได้รับประโยชน์จากฟังก์ชันที่ทรงพลังตั้งแต่วันแรกที่ติดตั้ง
แน่นอนว่า Bash ก็มีข้อดีใหญ่ๆ คือ "ใช้ได้ทุกที่" และ "มีข้อมูลมหาศาล" แต่ในฐานะ "คู่หู" ที่ต้องใช้ทำงานพัฒนาร่วมกันทุกวัน ลองเลือก Fish ที่เป็นมิตรและทรงพลังกว่าดูไหมครับ? โดยเฉพาะสำหรับเว็บครีเอเตอร์มือใหม่ที่กำลังจะเริ่มฝึกใช้ command line, Fish จะเป็นเพื่อนคู่คิดในการเรียนรู้ที่ดีที่สุดของคุณอย่างแน่นอน
ฟังก์ชันที่เราแนะนำในบทความนี้เป็นเพียงส่วนหนึ่งของเสน่ห์ของ Fish เท่านั้น ในขั้นตอนต่อไป ลองท้าทายตัวเองด้วยการปรับแต่งผ่านปลั๊กอินเมเนเจอร์ดูสิครับ คุณสามารถเปลี่ยนหน้าตาให้เท่ขึ้น เพิ่มฟังก์ชันที่สะดวกสบายยิ่งขึ้น และสร้างสภาพแวดล้อมเทอร์มินัลที่แข็งแกร่งที่สุดในแบบของคุณเองได้
ไปยังบทความถัดไป: คู่มือเริ่มต้นการปรับแต่งและติดตั้งธีมสำหรับ Fish (Fisher, Oh My Fish)