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

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

เวลาใช้ Linux หรือ macOS เรามักจะได้ยินคำว่า "เชลล์" หรือ "Bash" กันบ่อยๆ ใช่ไหมครับ แต่คุณเคยรู้จักเชลล์ที่ชื่อว่า Dash หรือไม่? จริงๆ แล้ว Dash เป็นเหมือนฮีโร่หลังบ้านที่ทำงานอย่างหนักในระบบปฏิบัติการ Linux ตระกูล Debian อย่าง Ubuntu

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


Dash Shell คืออะไร?

Dash ย่อมาจาก "Debian Almquist shell" ซึ่งตามชื่อเลยครับ มันคือเชลล์ที่พัฒนาโดยโครงการ Debian โดยมีพื้นฐานมาจากการพอร์ต Almquist Shell (ash) ที่เคยใช้ใน NetBSD มาสู่ Linux

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

โดยเฉพาะใน Ubuntu และ Debian เชลล์เริ่มต้นของระบบที่ /bin/sh นั้น จริงๆ แล้วเป็นเพียงลิงก์สัญลักษณ์ (เหมือนทางลัด) ที่ชี้ไปยัง Dash ด้วยเหตุนี้ สคริปต์ต่างๆ ของระบบจึงทำงานได้เร็วขึ้น ซึ่งมีส่วนช่วยเพิ่มประสิทธิภาพโดยรวมของระบบปฏิบัติการ


ข้อดีหลัก (คุณสมบัติ) ของ Dash

เรามาดูข้อดีของ Dash ให้ลึกขึ้นอีกหน่อยกันครับ

  • 🚀 ความเร็วในการประมวลผลสูง: เนื่องจากฟังก์ชันที่เรียบง่าย ทำให้การเปิดโปรแกรมและการแปลสคริปต์ทำได้รวดเร็วมาก โดยเฉพาะในการประมวลผลที่ต้องทำซ้ำเป็นพันๆ ครั้ง หรือการรันสคริปต์ขนาดเล็กจำนวนมาก ความแตกต่างด้านความเร็วเมื่อเทียบกับ Bash จะเห็นได้อย่างชัดเจน
  • ใช้หน่วยความจำน้อย: ด้วยความที่มีขนาดเล็ก ทำให้ช่วยประหยัดการใช้หน่วยความจำได้ ซึ่งเป็นข้อได้เปรียบอย่างมากในระบบสมองกลฝังตัวที่มีหน่วยความจำจำกัด หรือในสภาพแวดล้อมเซิร์ฟเวอร์ที่ต้องรันคอนเทนเนอร์จำนวนมากพร้อมกัน
  • เข้ากันได้กับมาตรฐาน POSIX: Dash ยึดตามมาตรฐาน POSIX อย่างเคร่งครัด ซึ่งหมายความว่า "เชลล์สคริปต์ที่เขียนให้ทำงานบน Dash ได้ ก็มีแนวโน้มสูงที่จะทำงานบนเชลล์อื่นที่เข้ากันได้กับ POSIX (เช่น zsh บน macOS) ได้อย่างถูกต้อง" Dash จึงเป็นสภาพแวดล้อมทดสอบที่เหมาะสมที่สุด หากคุณต้องการเพิ่มความสามารถในการพกพาและความเข้ากันได้ของสคริปต์

มาลองสัมผัส Dash ด้วยตัวเองกันเถอะ!

สิบปากว่าไม่เท่าตาเห็น มาลองใช้งาน Dash ด้วยตัวเองเพื่อสัมผัสกับคุณสมบัติเด่นของมันกันเลย!

1. ตรวจสอบเชลล์ปัจจุบันของคุณ

ก่อนอื่น มาตรวจสอบกันว่าเชลล์เริ่มต้นที่คุณกำลังใช้อยู่คืออะไร เปิดเทอร์มินัลขึ้นมาแล้วรันคำสั่งต่อไปนี้ ในกรณีส่วนใหญ่ ผลลัพธ์ที่ได้จะเป็น "bash" หรือ "zsh"

$ ps -p $$
  PID TTY          TIME CMD
 5678 pts/0    00:00:00 bash

2. เริ่มต้นใช้งาน Dash

ต่อไป เรามาลองเปิดใช้งาน Dash กันดูครับ เพียงแค่พิมพ์ `dash` ในบรรทัดคำสั่งแล้วกด Enter เมื่อสัญลักษณ์พร้อมรับคำสั่ง (prompt) เปลี่ยนเป็นเครื่องหมาย `$` นั่นหมายความว่าคุณได้เข้าสู่โลกของ Dash แล้ว

$ dash
$ 

หากต้องการกลับไปยังเชลล์เดิม (เช่น Bash) ให้พิมพ์ `exit`


3. [สัมผัสจริง] เปรียบเทียบความเร็วกับ Bash

เรามาเปรียบเทียบกันดูว่า Dash เร็วแค่ไหนผ่านการประมวลผลแบบวนซ้ำง่ายๆ ในที่นี้ เราจะลองรันสคริปต์ที่นับเลข 1 ถึง 100,000 ด้วย Bash และ Dash ตามลำดับ โดยใช้คำสั่ง time เพื่อวัดระยะเวลาที่ใช้ในการประมวลผล

เริ่มจากรันด้วย Bash ก่อน

$ time bash -c 'i=0; while [ $i -lt 100000 ]; do i=$((i+1)); done'

real    0m1.523s
user    0m1.518s
sys     0m0.005s

*ระยะเวลาในการประมวลผลอาจแตกต่างกันไปในแต่ละสภาพแวดล้อม


ต่อไป ลองรันการประมวลผลเดียวกันด้วย Dash

$ time dash -c 'i=0; while [ $i -lt 100000 ]; do i=$((i+1)); done'

real    0m0.384s
user    0m0.381s
sys     0m0.003s

เป็นอย่างไรบ้างครับ? ในสภาพแวดล้อมของผม การประมวลผลที่ใช้เวลาประมาณ 1.5 วินาทีใน Bash กลับเสร็จสิ้นในเวลาไม่ถึง 0.4 วินาทีเมื่อใช้ Dash ซึ่งเร็วกว่าเกือบ 4 เท่า! จะเห็นได้ว่าในการรันสคริปต์ง่ายๆ ซ้ำๆ ความเร็วของ Dash นั้นมีประสิทธิภาพอย่างยิ่ง


ข้อควรระวัง: ฟังก์ชันที่มีใน Bash แต่ไม่มีใน Dash

แม้ว่า Dash จะเร็ว แต่ก็ต้องแลกมากับการที่ไม่มีฟังก์ชันอำนวยความสะดวกบางอย่างที่มีใน Bash ซึ่งเราเรียกสิ่งนี้ว่า "Bashism" (ความเป็น Bash) หากไม่ระวังและเขียนสคริปต์ด้วยไวยากรณ์ของ Bash สคริปต์นั้นจะเกิดข้อผิดพลาดเมื่อรันด้วย Dash

ตัวอย่างที่ 1: ไม่สามารถใช้ Array ได้

ใน Bash เราสามารถใช้ `()` เพื่อสร้าง Array ได้อย่างง่ายดาย แต่ใน Dash ไม่มีแนวคิดเรื่อง Array

กรณีของ Bash (ทำงานปกติ)

$ bash -c 'fruits=("apple" "banana" "orange"); echo ${fruits[1]}'
banana

กรณีของ Dash (เกิดข้อผิดพลาด)

$ dash -c 'fruits=("apple" "banana" "orange"); echo ${fruits[1]}'
dash: 1: Syntax error: "(" unexpected

ตัวอย่างที่ 2: ไม่สามารถใช้คำสั่งทดสอบแบบขยาย `[[ ... ]]` ได้

`[[ ... ]]` ของ Bash มีฟังก์ชันขั้นสูงที่สามารถใช้จับคู่สตริงและนิพจน์ทั่วไปได้ แต่มันไม่ได้เป็นส่วนหนึ่งของมาตรฐาน POSIX ใน Dash เราจำเป็นต้องใช้ `[ ... ]` แบบดั้งเดิม

กรณีของ Bash (ทำงานปกติ)

$ bash -c '[[ "hello" == "hello" ]] && echo "Yes"'
Yes

กรณีของ Dash (เกิดข้อผิดพลาด)

$ dash -c '[[ "hello" == "hello" ]] && echo "Yes"'
dash: 1: [[: not found

วิธีเขียนที่ถูกต้องใน Dash

ในการทำสิ่งเดียวกันใน Dash ให้ใช้ `[` และเครื่องหมายเท่ากับ `=` เพียงตัวเดียว

$ dash -c '[ "hello" = "hello" ] && echo "Yes"'
Yes

ตัวอย่างที่ 3: ไม่สามารถใช้ Brace Expansion `{...}` ได้

Brace Expansion ซึ่งมีประโยชน์ในการสร้างชื่อไฟล์ต่อเนื่องกัน ก็เป็นฟังก์ชันของ Bash เช่นกัน

กรณีของ Bash (ทำงานปกติ)

$ bash -c 'echo file-{1..3}.txt'
file-1.txt file-2.txt file-3.txt

กรณีของ Dash (จะแสดงผลตามที่พิมพ์)

$ dash -c 'echo file-{1..3}.txt'
file-{1..3}.txt

การใช้งานหลักของ Dash

จากคุณสมบัติเหล่านี้ Dash ถูกนำไปใช้งานในสถานการณ์ใดบ้าง?

  • สคริปต์ khởi động hệ thống: นี่คือการใช้งานที่พบบ่อยที่สุด ช่วยประมวลผลสคริปต์จำนวนมากที่รันตอนเปิดเครื่อง OS ได้อย่างรวดเร็วและลดเวลาในการบูต
  • การรันเชลล์สคริปต์: คุณสามารถเพิ่มประสิทธิภาพได้โดยการเขียนสคริปต์ที่ต้องการความเร็วในการประมวลผลสูง (เช่น การวิเคราะห์ไฟล์ล็อกขนาดใหญ่, การประมวลผลแบบแบตช์ง่ายๆ) ด้วย Dash
  • สภาพแวดล้อมที่มีทรัพยากรจำกัด: Dash เป็นที่นิยมในสภาพแวดล้อมที่มีหน่วยความจำและพลังประมวลผลจำกัด เช่น อุปกรณ์ IoT, ระบบสมองกลฝังตัว และคอนเทนเนอร์ Docker
  • การตรวจสอบความเข้ากันได้ของสคริปต์: วิธีที่ดีในการตรวจสอบว่าเชลล์สคริปต์ของคุณไม่ได้พึ่งพาฟังก์ชันเฉพาะของ Bash (นั่นคือเข้ากันได้กับ POSIX หรือไม่) คือการลองรันด้วย `dash myscript.sh`

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


สรุป: มาใช้ Bash และ Dash อย่างชาญฉลาดกันเถอะ

ในบทความนี้ เราได้อธิบายเกี่ยวกับเชลล์ที่เบาและรวดเร็วอย่าง "Dash"

  • Dash คือเชลล์ที่มุ่งเน้นความเบาและรวดเร็วโดยการตัดทอนฟังก์ชัน เหมาะสำหรับงานเบื้องหลังของระบบและการรันสคริปต์ความเร็วสูง
  • Bash คือเชลล์ที่มีฟังก์ชันครบครันและเต็มไปด้วยฟีเจอร์อำนวยความสะดวก เหมาะสำหรับการใช้งานแบบโต้ตอบที่เราใช้พิมพ์คำสั่งในชีวิตประจำวัน

สิ่งสำคัญคือการเข้าใจจุดแข็งและจุดอ่อนของแต่ละเชลล์ ไม่แนะนำให้เปลี่ยนเชลล์ล็อกอินเริ่มต้นจาก Bash เป็น Dash เพียงเพราะ "มันเร็วกว่า"

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