ข้ามไปเนื้อหา

เชลล์

จากวิกิพีเดีย สารานุกรมเสรี

เชลล์ (อังกฤษ: shell) ในทางคอมพิวเตอร์ คือส่วนติดต่อผู้ใช้หรือตัวแปลภาษาคำสั่งที่รับคำสั่งจากผู้ใช้หรือจากสคริปต์ แล้วสั่งให้ระบบปฏิบัติการหรือโปรแกรมอื่นทำงานต่อไป ในระบบแบบยูนิกซ์และระบบที่คล้ายยูนิกซ์ คำว่าเชลล์มักหมายถึงโปรแกรมบรรทัดคำสั่ง เช่น Bash, zsh, ksh หรือ csh ส่วนในระบบไมโครซอฟท์วินโดวส์ ตัวอย่างเชลล์แบบบรรทัดคำสั่งได้แก่ Command Prompt และ PowerShell ขณะที่คำว่าเชลล์ในอีกความหมายหนึ่งอาจหมายถึงส่วนติดต่อกราฟิกของระบบ เช่น Windows shell, Finder ใน macOS หรือ GNOME Shell[1][2][3]

เชลล์แตกต่างจากเคอร์เนล ซึ่งเป็นแกนกลางของระบบปฏิบัติการที่จัดการทรัพยากรของเครื่อง เช่น กระบวนการ หน่วยความจำ ระบบไฟล์ และอุปกรณ์ เชลล์โดยทั่วไปทำงานในพื้นที่ผู้ใช้ และเรียกใช้โปรแกรมหรือบริการของระบบผ่านกลไกของระบบปฏิบัติการ[4] เชลล์ยังแตกต่างจากเทอร์มินัลหรือโปรแกรมจำลองเทอร์มินัล ซึ่งเป็นหน้าต่างหรืออุปกรณ์ที่รับแป้นพิมพ์และแสดงผลข้อความ แต่ภายในเทอร์มินัลอาจเรียกใช้เชลล์ได้หลายชนิด เช่น Bash, zsh, fish หรือ พาวเวอร์เชลล์

ความหมาย

[แก้]

คำว่า “เชลล์” มีที่มาจากแนวคิดว่าโปรแกรมชนิดนี้เป็นชั้นนอกที่ห่อหุ้มบริการของระบบปฏิบัติการไว้ และให้ผู้ใช้สั่งงานระบบได้โดยไม่ต้องติดต่อกับเคอร์เนลโดยตรง ในมาตรฐาน POSIX เชลล์ถูกอธิบายว่าเป็น “ตัวแปลภาษาคำสั่ง” (command language interpreter) ซึ่งอ่านคำสั่งจากบรรทัดคำสั่ง จากสตริง หรือจากไฟล์ แล้วตีความตามภาษาของเชลล์[1][5]

ในความหมายกว้าง เชลล์เป็นส่วนติดต่อผู้ใช้ของระบบคอมพิวเตอร์ อาจเป็นได้ทั้งเชลล์แบบบรรทัดคำสั่งและเชลล์แบบกราฟิก ส่วนในความหมายแคบ โดยเฉพาะในบริบทของยูนิกซ์และลินุกซ์ เชลล์มักหมายถึงโปรแกรมที่ผู้ใช้พิมพ์คำสั่ง เช่น cd, ls, grep หรือรันสคริปต์เพื่อทำงานอัตโนมัติ

ความสัมพันธ์กับเคอร์เนล เทอร์มินัล และเคอร์เนลของ Jupyter

[แก้]

เชลล์มักถูกสับสนกับเคอร์เนลและเทอร์มินัล เพราะทั้งสามเกี่ยวข้องกับการสั่งงานคอมพิวเตอร์ แต่ทำหน้าที่คนละระดับ

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

ตัวอย่างเช่น เมื่อผู้ใช้เปิดแอปพลิเคชัน Terminal บนลินุกซ์หรือ macOS แอปพลิเคชันนั้นเป็นเทอร์มินัล ส่วนโปรแกรมที่รับคำสั่งภายในอาจเป็น Bash หรือ zsh ขณะที่เคอร์เนลของระบบปฏิบัติการทำหน้าที่จัดการการเรียกใช้โปรแกรมและทรัพยากรเบื้องหลัง

คำว่า “เคอร์เนล” ยังใช้ในบริบทอื่น เช่น Jupyter kernel ซึ่งหมายถึงโปรแกรมเฉพาะภาษาที่รันและตรวจสอบโค้ดของผู้ใช้ใน Jupyter ไม่ใช่เคอร์เนลของระบบปฏิบัติการโดยตรง[6] เช่น IPython kernel ใช้รันโค้ด Python ใน Jupyter Notebook หรือ JupyterLab

ประเภท

[แก้]

เชลล์แบบบรรทัดคำสั่ง

[แก้]

เชลล์แบบบรรทัดคำสั่ง (command-line shell) รับคำสั่งเป็นข้อความ ผู้ใช้พิมพ์คำสั่งและอาร์กิวเมนต์ลงไป แล้วเชลล์จะแปลคำสั่ง เรียกโปรแกรมที่เกี่ยวข้อง จัดการการเปลี่ยนเส้นทางข้อมูล และส่งผลลัพธ์กลับมา เชลล์ชนิดนี้เหมาะกับงานอัตโนมัติ งานดูแลระบบ งานที่ต้องทำซ้ำ และงานที่ต้องประสานโปรแกรมหลายตัวเข้าด้วยกัน

เชลล์แบบบรรทัดคำสั่งมักทำหน้าที่เป็นทั้งตัวแปลคำสั่งและภาษาสคริปต์ คู่มือ GNU Bash อธิบายว่าเชลล์ของยูนิกซ์เป็นทั้งตัวแปลคำสั่งและภาษาโปรแกรม ผู้ใช้สามารถรวมคำสั่งหลายคำสั่งไว้ในไฟล์ แล้วใช้ไฟล์นั้นเป็นคำสั่งใหม่ได้[2] ตัวอย่างเชลล์ชนิดนี้ ได้แก่ sh, Bash, ksh, csh, zsh, fish, Command Prompt และ PowerShell

เชลล์แบบกราฟิก

[แก้]

เชลล์แบบกราฟิก (graphical shell) ให้ผู้ใช้สั่งงานระบบผ่านหน้าต่าง ไอคอน เมนู แถบงาน เดสก์ท็อป หรือส่วนติดต่อกราฟิกอื่น แทนการพิมพ์คำสั่งเป็นข้อความ ตัวอย่างเช่น Windows shell ซึ่งสัมพันธ์กับ File Explorer และเดสก์ท็อปของ Windows, Finder ใน macOS ซึ่งใช้ดูและจัดการไฟล์และโฟลเดอร์[7] และ GNOME Shell ซึ่งเป็นส่วนติดต่อหลักของสภาพแวดล้อมเดสก์ท็อป GNOME[8]

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

การทำงานของเชลล์แบบบรรทัดคำสั่ง

[แก้]

เมื่อผู้ใช้พิมพ์คำสั่ง เชลล์แบบบรรทัดคำสั่งมักทำงานเป็นลำดับโดยย่อดังนี้

  1. อ่านคำสั่งจากผู้ใช้หรือจากสคริปต์
  2. แยกคำสั่ง อาร์กิวเมนต์ ตัวแปร เครื่องหมายคำพูด และตัวดำเนินการ
  3. ขยายรูปแบบ เช่น ตัวแปร สัญลักษณ์แทนชื่อไฟล์ หรือคำสั่งย่อย
  4. จัดการการเปลี่ยนเส้นทางข้อมูล เช่น อินพุต เอาต์พุต และท่อส่งข้อมูล
  5. เรียกใช้คำสั่งภายในเชลล์หรือโปรแกรมภายนอก
  6. ส่งค่าสถานะการจบงานและผลลัพธ์กลับให้ผู้ใช้หรือสคริปต์

ตัวอย่างในเชลล์แบบ POSIX หรือ Bash:

grep "error" server.log | sort | uniq -c

คำสั่งนี้อ่านไฟล์ server.log เลือกบรรทัดที่มีคำว่า error จัดเรียงผลลัพธ์ แล้วนับบรรทัดที่ซ้ำกัน ตัวอย่างนี้แสดงแนวคิดสำคัญของเชลล์ยูนิกซ์ คือการประกอบโปรแกรมเล็กหลายตัวเข้าด้วยกันผ่านท่อส่งข้อมูล

เชลล์สคริปต์

[แก้]

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

ตัวอย่างเชลล์สคริปต์แบบ POSIX:

#!/bin/sh
for file in *.txt
do
    echo "พบไฟล์: $file"
done

ในระบบวินโดวส์ PowerShell ก็ใช้เขียนสคริปต์ได้เช่นกัน โดย Microsoft อธิบายว่า PowerShell เป็นทั้ง command-line shell, scripting language และระบบสำหรับการทำงานอัตโนมัติ/จัดการคอนฟิกูเรชัน โดยมีจุดเด่นคือรับและส่งออกข้อมูลเป็นออบเจกต์ .NET แทนการประมวลผลข้อความล้วนแบบเชลล์ดั้งเดิมหลายชนิด[3]

ตัวอย่างเชลล์

[แก้]

ระบบยูนิกซ์และระบบที่คล้ายยูนิกซ์

[แก้]
  • Bourne shell หรือ sh เป็นเชลล์สำคัญในประวัติศาสตร์ยูนิกซ์ และเป็นฐานของภาษาเชลล์แบบ POSIX
  • Bash หรือ Bourne-Again SHell เป็นเชลล์ของโครงการ GNU และเป็นเชลล์ที่ใช้แพร่หลายในลินุกซ์หลายระบบ[2]
  • KornShell หรือ ksh เป็นเชลล์ที่พัฒนาต่อยอดจาก Bourne shell พร้อมความสามารถเชิงสคริปต์เพิ่มเติม
  • C shell หรือ csh ใช้ไวยากรณ์ที่ได้รับอิทธิพลบางส่วนจากภาษา C
  • zsh เป็นเชลล์ที่มีความสามารถด้านการเติมคำและการปรับแต่งสูง
  • fish เป็นเชลล์สมัยใหม่ที่เน้นความสะดวกในการใช้งานแบบโต้ตอบ

ระบบไมโครซอฟท์วินโดวส์

[แก้]
  • COMMAND.COM เป็น command interpreter ของ MS-DOS และ Windows รุ่นเก่า
  • Command Prompt หรือ cmd.exe เป็นเชลล์บรรทัดคำสั่งของ Windows ในตระกูล Windows NT
  • PowerShell เป็นเชลล์และภาษาสคริปต์ของ Microsoft ที่สร้างบน .NET ใช้ได้ทั้งบน Windows, macOS และ Linux ในรุ่นใหม่[3]
  • Windows shell ในความหมายแบบกราฟิกสัมพันธ์กับเดสก์ท็อป แถบงาน Start menu และ File Explorer ของ Windows

เชลล์แบบกราฟิกและเดสก์ท็อป

[แก้]
  • Finder เป็นส่วนติดต่อสำหรับดูและจัดการไฟล์ โฟลเดอร์ และตำแหน่งต่าง ๆ ใน macOS[7]
  • GNOME Shell เป็นส่วนติดต่อหลักของ GNOME 3 และรุ่นต่อมา[8]
  • KDE Plasma เป็นสภาพแวดล้อมเดสก์ท็อปที่มีเชลล์กราฟิกสำหรับระบบลินุกซ์และยูนิกซ์คล้ายกัน
  • CDE หรือ Common Desktop Environment เป็นสภาพแวดล้อมเดสก์ท็อปเชิงประวัติศาสตร์ในระบบยูนิกซ์หลายระบบ

เชลล์ของภาษาโปรแกรมและสภาพแวดล้อมโต้ตอบ

[แก้]

คำว่าเชลล์ยังใช้กับสภาพแวดล้อมโต้ตอบของภาษาโปรแกรม เช่น Python interactive shell, IPython, Ruby IRB หรือ REPL ของภาษาอื่น ๆ เชลล์ประเภทนี้ไม่ได้เป็นเชลล์ของระบบปฏิบัติการโดยตรง แต่ทำหน้าที่คล้ายกันในระดับภาษาโปรแกรม คือรับคำสั่งหรือโค้ดทีละบรรทัด ตีความ แล้วแสดงผลลัพธ์

ประวัติ

[แก้]

แนวคิดเชลล์มีรากจากระบบปฏิบัติการยุคแรกที่แยกชั้นผู้ใช้กับแกนระบบออกจากกัน ในระบบยูนิกซ์ เชลล์เป็นองค์ประกอบสำคัญที่ให้ผู้ใช้เรียกใช้โปรแกรมและรวมโปรแกรมเข้าด้วยกันผ่านท่อส่งข้อมูลและการเปลี่ยนเส้นทางข้อมูล Bourne shell ซึ่งพัฒนาโดย Stephen Bourne ที่ Bell Labs มีอิทธิพลสูงต่อเชลล์รุ่นหลังและมาตรฐาน POSIX

ภายหลังมีเชลล์จำนวนมากเกิดขึ้นเพื่อตอบโจทย์ที่ต่างกัน เช่น C shell เน้นไวยากรณ์ที่คล้ายภาษา C และการใช้งานแบบโต้ตอบ, KornShell เพิ่มคุณสมบัติด้านสคริปต์และการทำงานกับคำสั่ง, Bash พัฒนาเป็นเชลล์ของโครงการ GNU และรวมคุณสมบัติจาก Bourne shell, KornShell และ C shell เข้าด้วยกัน[2] ส่วน PowerShell เกิดขึ้นในระบบวินโดวส์เพื่อตอบโจทย์การดูแลระบบและระบบอัตโนมัติแบบออบเจกต์[3]

เชลล์แบบกราฟิกพัฒนาควบคู่กับส่วนติดต่อกราฟิกของระบบปฏิบัติการ เช่น Finder ใน Macintosh/macOS, Program Manager และต่อมา Windows Explorer/File Explorer ใน Windows รวมถึงเดสก์ท็อปเชลล์ในระบบลินุกซ์ เช่น GNOME Shell และ KDE Plasma

ความปลอดภัย

[แก้]

เชลล์สามารถเรียกโปรแกรม จัดการไฟล์ และควบคุมระบบได้ จึงต้องใช้ด้วยความระมัดระวัง[9] คำสั่งผิดพลาดอาจลบไฟล์จำนวนมาก เขียนทับข้อมูล หรือเปิดช่องให้รันโค้ดที่ไม่ปลอดภัยได้ ปัญหาด้านความปลอดภัยที่เกี่ยวข้องกับเชลล์ที่พบบ่อย เช่น command injection, การรันสคริปต์จากแหล่งไม่น่าเชื่อถือ, การใช้สิทธิผู้ดูแลระบบโดยไม่จำเป็น และการจัดการตัวแปรหรือเครื่องหมายคำพูดผิดพลาดในสคริปต์[10][11][12] ในเชลล์สคริปต์ ผู้เขียนควรตรวจสอบอินพุต ระวังการขยายตัวแปรและ wildcard ใช้เครื่องหมายคำพูดอย่างเหมาะสม และหลีกเลี่ยงการคัดลอกคำสั่งที่ไม่เข้าใจมารันโดยตรง โดยเฉพาะคำสั่งที่ใช้สิทธิผู้ดูแลระบบหรือดาวน์โหลดสคริปต์จากอินเทอร์เน็ตมารันทันที[13][14]

ดูเพิ่ม

[แก้]

อ้างอิง

[แก้]
  1. 1 2 "Shell Command Language". The Open Group. สืบค้นเมื่อ 8 กรกฎาคม 2026.
  2. 1 2 3 4 "Bash Reference Manual". GNU Project. สืบค้นเมื่อ 8 กรกฎาคม 2026.
  3. 1 2 3 4 "What is PowerShell?". Microsoft Learn. สืบค้นเมื่อ 8 กรกฎาคม 2026.
  4. "The Linux kernel user-space API guide". The Linux Kernel documentation. สืบค้นเมื่อ 8 กรกฎาคม 2026.
  5. "sh — Shell Command Language". The Open Group. สืบค้นเมื่อ 8 กรกฎาคม 2026.
  6. "Kernels". Project Jupyter. สืบค้นเมื่อ 8 กรกฎาคม 2026.
  7. 1 2 "Use the Finder on Mac". Apple Support. สืบค้นเมื่อ 8 กรกฎาคม 2026.
  8. 1 2 "GNOME Shell, next generation desktop shell". GNOME Project. สืบค้นเมื่อ 8 กรกฎาคม 2026.
  9. "Bash Reference Manual". GNU. Free Software Foundation. สืบค้นเมื่อ 8 กรกฎาคม 2026.{{cite web}}: CS1 maint: date auto-translated (ลิงก์)
  10. "Command Injection". OWASP. Open Worldwide Application Security Project. สืบค้นเมื่อ 8 กรกฎาคม 2026.{{cite web}}: CS1 maint: date auto-translated (ลิงก์)
  11. "OS Command Injection Defense Cheat Sheet". OWASP Cheat Sheet Series. Open Worldwide Application Security Project. สืบค้นเมื่อ 8 กรกฎาคม 2026.{{cite web}}: CS1 maint: date auto-translated (ลิงก์)
  12. "least privilege". Computer Security Resource Center. National Institute of Standards and Technology. สืบค้นเมื่อ 8 กรกฎาคม 2026.{{cite web}}: CS1 maint: date auto-translated (ลิงก์)
  13. "Shell Style Guide". Google Style Guides. Google. สืบค้นเมื่อ 8 กรกฎาคม 2026.{{cite web}}: CS1 maint: date auto-translated (ลิงก์)
  14. "Shell Scripts: Stay Small & Simple". Google Testing Blog. Google. 11 ตุลาคม 2023. สืบค้นเมื่อ 8 กรกฎาคม 2026.{{cite web}}: CS1 maint: date auto-translated (ลิงก์)

แหล่งข้อมูลอื่น

[แก้]