🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

เรียนรู้การทำงานพื้นฐานพร้อมเปรียบเทียบความแตกต่างระหว่าง Fish และ Bash

ในการสร้างเว็บ สิ่งที่ขาดไม่ได้เลยก็คือ "หน้าจอสีดำ" หรือการใช้คำสั่งในเทอร์มินัล (เชลล์) หลายคนคงคุ้นเคยกับการใช้ "Bash" ซึ่งเป็นเชลล์พื้นฐานที่ติดมากับระบบปฏิบัติการโดยไม่รู้ตัว แต่ในโลกนี้ยังมีเชลล์ที่มีฟังก์ชันสูงกว่าและช่วยให้การทำงานของเรามีประสิทธิภาพขึ้นอย่างมาก และตัวแทนของเชลล์เหล่านั้นก็คือ "Fish (Friendly Interactive Shell)" ที่เราจะมาแนะนำกันในวันนี้

ในบทความนี้ เราจะเปรียบเทียบ Fish กับ "Bash" ที่เป็นที่นิยมที่สุด พร้อมอธิบายวิธีการใช้งานพื้นฐานไปจนถึงฟังก์ชันที่น่าสนใจอย่างละเอียด เพื่อเป็นก้าวแรกให้เหล่าเว็บครีเอเตอร์ได้มีชีวิตการเขียนโค้ดที่สะดวกสบายยิ่งขึ้น โค้ดทั้งหมดถูกสร้างขึ้นมาเพื่อให้สามารถทำงานได้อย่างสมบูรณ์เพียงแค่คัดลอกและวาง มาเริ่มต้นสำรวจโลกของ Fish ไปพร้อมๆ กับการสะสมประสบการณ์ความสำเร็จเล็กๆ น้อยๆ จากการที่โค้ด "ทำงานได้!" กันเถอะครับ

Fish กับ Bash ต่างกันอย่างไร? มาทำความรู้จักพื้นฐานของเชลล์กัน

ก่อนอื่น เรามาทำความเข้าใจคุณสมบัติเด่นของแต่ละเชลล์กันก่อน

ถ้าจะเปรียบเทียบ 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:

แน่นอนว่า Bash ก็มีข้อดีใหญ่ๆ คือ "ใช้ได้ทุกที่" และ "มีข้อมูลมหาศาล" แต่ในฐานะ "คู่หู" ที่ต้องใช้ทำงานพัฒนาร่วมกันทุกวัน ลองเลือก Fish ที่เป็นมิตรและทรงพลังกว่าดูไหมครับ? โดยเฉพาะสำหรับเว็บครีเอเตอร์มือใหม่ที่กำลังจะเริ่มฝึกใช้ command line, Fish จะเป็นเพื่อนคู่คิดในการเรียนรู้ที่ดีที่สุดของคุณอย่างแน่นอน

ฟังก์ชันที่เราแนะนำในบทความนี้เป็นเพียงส่วนหนึ่งของเสน่ห์ของ Fish เท่านั้น ในขั้นตอนต่อไป ลองท้าทายตัวเองด้วยการปรับแต่งผ่านปลั๊กอินเมเนเจอร์ดูสิครับ คุณสามารถเปลี่ยนหน้าตาให้เท่ขึ้น เพิ่มฟังก์ชันที่สะดวกสบายยิ่งขึ้น และสร้างสภาพแวดล้อมเทอร์มินัลที่แข็งแกร่งที่สุดในแบบของคุณเองได้

ไปยังบทความถัดไป: คู่มือเริ่มต้นการปรับแต่งและติดตั้งธีมสำหรับ Fish (Fisher, Oh My Fish)