ทำไมมีหลายเชลล์ในระบบ Unix like?


16

ฉันเพิ่งเริ่มเรียนรู้พื้นฐานของยูนิกซ์และสงสัยว่าทำไมมีกระสุนจำนวนมากในระบบยูนิกซ์ จากหนังสือการวางโปรแกรมขั้นสูงใน Unix Environment :

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

จากนั้นหนังสือก็จะแสดงรายการโปรแกรมเชลล์เช่น Bourne shell, Bourne-again shell, Cshell และอื่น ๆ อีกมากมาย คำถามของฉันนั้นโดยทั่วไปแล้วทำไมเราถึงต้องการเชลล์หลายอัน?


4
เหตุผลเดียวกันที่มีมาตรฐานมากมายสำหรับเทคโนโลยีอื่น ๆ ที่ใช้ xkcd.com/927
Dan เล่นซอโดย Firelight

1
ด้วยเหตุผลเดียวกันว่าทำไมคุณสามารถมีคอมไพเลอร์ / ล่ามสำหรับภาษาการเขียนโปรแกรมหลายภาษา (รวมถึงคอมไพเลอร์หลายภาษาสำหรับหนึ่งภาษา) หรืออินเทอร์เน็ตเบราว์เซอร์หลายตัว
Mischa Arefiev

6
คำถามของคุณไม่น่าเชื่อ " ทำไมเราต้องมีหลายเชลล์? " ใครบอกคุณว่าเราต้องการเชลล์หลายอัน? หนังสือของคุณบอกว่าเรามีกระสุนหลายนัด นั่นไม่ใช่สิ่งเดียวกัน
Rob

คำตอบ:


15

เชลล์ส่วนใหญ่ที่ใช้ในสภาพแวดล้อม UNIX ที่ทันสมัยมีความหมายเพื่อให้สอดคล้องกับข้อมูลจำเพาะ POSIX sh POSIX sh มาจาก Korn เชลล์ดั้งเดิม (ksh88) ซึ่งได้มาจากเชลล์เป้าหมายก่อนหน้านี้ แต่ POSIX sh จะระบุชุดย่อยขนาดเล็กของการทำงานของ ksh88 แม้แต่คู่เท่านั้น เชลล์ที่ใช้เพียงความต้องการขั้นต่ำขาดคุณสมบัติหลายอย่างที่จำเป็นสำหรับการเขียนทั้งหมดยกเว้นสคริปต์ที่เล็กน้อยที่สุดในลักษณะที่ปลอดภัยและสมเหตุสมผล ตัวอย่างเช่นตัวแปรโลคัลและอาร์เรย์เป็นค่าพิเศษที่ไม่ได้มาตรฐาน

ดังนั้นเหตุผลแรกคือการขยายเปลือกด้วยคุณสมบัติพิเศษ กระสุนที่แตกต่างกันเลือกที่จะมุ่งเน้นไปที่สิ่งต่าง ๆ ตัวอย่างเช่น Zsh มุ่งเน้นไปที่คุณสมบัติการโต้ตอบขั้นสูงในขณะที่ ksh93 (เชลล์ korn "ดั้งเดิม" ปัจจุบัน) มุ่งเน้นไปที่คุณสมบัติการเขียนโปรแกรมและประสิทธิภาพ แม้แต่กระสุนขนาดเล็กที่สุดเช่น Dash เพิ่มอย่างน้อยพิเศษที่ไม่ได้มาตรฐานเช่นตัวแปรท้องถิ่น

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

เหตุผลที่สองคือมรดก ยังมี Unixes ที่เป็นกรรมสิทธิ์จำนวนมากอยู่ที่นั่นซึ่งใช้การใช้งานที่ไม่ได้มาตรฐานแบบโบราณสำหรับ / bin / sh จนกระทั่งเมื่อเร็ว ๆ Solaris ยังคงใช้ Bourne เป็นค่าเริ่มต้นและเลือกที่จะรักษาเชลล์ Heirloom แทนที่จะอัพเกรดเป็นของทันสมัย ระบบเหล่านี้มักจะมาพร้อมกับเชลล์ที่แตกต่างกันที่คุณสามารถเปลี่ยนไปได้เช่นโดยการเปลี่ยนตัวแปร PATH ของคุณหรือแก้ไข shebangs ภายในสคริปต์แต่ละตัว

ดังนั้นเพื่อสรุป มีหลายเชลล์โดยค่าเริ่มต้น:

  • สำหรับคุณสมบัติพิเศษโดยเฉพาะอย่างยิ่งสำหรับการจัดการกับอุปกรณ์เสริมที่ไม่ใช่พกพา
  • เพื่อจัดการกับสคริปต์แบบดั้งเดิมซึ่งมักจะไม่ถูกทำลาย
  • ขนาด / ประสิทธิภาพ ระบบฝังตัวมักจะต้องการเชลล์ขนาดเล็กเช่น mksh หรือ busybox sh
  • เหตุผลการออกใบอนุญาต AT&T ksh เป็นซอฟต์แวร์ที่เป็นกรรมสิทธิ์จนกระทั่งประมาณ 2,000 หรือมากกว่านั้น นี่คือสิ่งที่ก่อให้เกิดโคลน ksh ทั้งหมดเช่น Zsh และ Bash
  • เหตุผลทางประวัติศาสตร์อื่น ๆ แม้ว่าจะไม่ได้รับความนิยมมากในวันนี้ แต่ก็มีความพยายามที่รุนแรงในการออกแบบภาษาเช่น scsh และ es คุณสมบัติการทดแทนกระบวนการของเชลล์จำนวนมากมาจาก rc (ด้วยไวยากรณ์ที่แตกต่างกันเล็กน้อย) และการขยายรั้งจาก csh กระสุนที่แตกต่างกันมีคุณสมบัติที่แตกต่างกันรวมอยู่ด้วยโดยทั่วไปแล้วจะมีความแตกต่างเล็กน้อยหรือไม่ลึกซึ้ง

2
หมายเหตุว่าถึงแม้จะlocalไม่ได้เป็น POSIX หรือ Unix ก็มีการระบุและจำเป็นต้องใช้ในลินุกซ์มาตรฐาน (LSB) และนโยบายเดเบียนมาตรฐาน ทราบว่าเป็นติดตามes rc
Stéphane Chazelas

1
สิ่งที่mkshเกิดขึ้นในขณะนี้คือPublic Domain Bourne Shell ซึ่งถูกเขียนขึ้นเนื่องจากเหตุผลด้านลิขสิทธิ์ (ปัญหาเหล่านี้ยังคงอยู่ - การออกใบอนุญาตและความสะดวกในการพกพาและขนาดเป็นปัจจัยสามประการที่ช่วยให้ฉันโน้มน้าวให้ Google รวม mksh กับ Android)
mirabilos

19

เพราะผู้คนมีความต้องการที่แตกต่างกันและเป็นการดีที่มีทางเลือกที่เหมาะสมกับความต้องการของคุณในสถานการณ์ที่กำหนด เชลล์เป็นเพียงเครื่องมือในตัวของมันเองและควรจะมีคนอื่นมาแทนที่ในความคิดของฉัน นั่นคือพลังของ Unix / Linux ซึ่งตรงข้ามกับสิ่งที่ Microsoft Windows เลือกให้เป็น

ในทำนองเดียวกัน ... ทำไมจึงมีโปรแกรมแก้ไขข้อความมากมาย? ทำไมคนพัฒนาเบราว์เซอร์ใหม่ถ้ามีอยู่แล้ว? ทำไมถึงมี GNOME, KDE, Xfce, LXDE, E17 เป็นต้น


12
แม่นยำ. หนึ่งอาจถามว่า "ทำไมผู้จัดการหน้าต่างจำนวนมาก?" เช่นกัน คนพื้นเมืองที่ใช้ยูนิกซ์อาจถามคำถามตรงข้าม: ทำไม CMD.EXE เพียงอันเดียว เหตุใด Windows จึงเข้มงวดและไม่สามารถปรับแต่งได้
Bruce Ediger

1
@BruceEdiger คุณหมายถึงอะไรแค่ cmd.exe เดียว? มีทางเลือกอื่นหากคุณต้องการใช้ แม้แต่ Microsoft เองก็มี PowerShell เป็นทางเลือก
Malcolm

3
แม้แต่COMMAND.COMใน DOS ก็เปลี่ยนได้ อย่างไรก็ตามคุณมักจะมีระบบที่เปราะบางมากเนื่องจากสมมติฐานของแอปพลิเคชันอื่น ๆ (และผู้ใช้อื่น ๆ ) CMD.EXEเป็นผลให้มีทางเลือกที่ประสบความสำเร็จไม่กี่ หนึ่งคือ PowerShell ซึ่งมีแรงเฉื่อยของ Microsoft ที่สนับสนุน อีกตัวอย่างหนึ่งก็คือน่าแปลกที่พอสมควรbashเนื่องจากได้รับการสนับสนุนอย่างดีจากชุมชน Cygwin ไม่ต้องพูดถึงกลุ่ม MinGW สำหรับ Window Managers Windows มีเพียงครั้งเดียว แต่มีหลายช่วงเวลาที่สภาพแวดล้อมของ Windows มีการพัฒนาตัวเอง
RBerteig

+1 สำหรับคำตอบนี้ ฉันคิดว่านั่นเป็นเหตุผลที่เรามีรสชาติ UNIX ที่แตกต่างกันมากมาย: AIX, HP-UX, Solaris, Tru64, IRIX, UnixWare, OS X, Linux, FreeBSD, NetBSD, OpenBSD, ... คุณชื่อมัน!
ตองกา

4

คำตอบสั้น ๆ

เนื่องจากประวัติศาสตร์การออกใบอนุญาตแปลกไม่มีกิจการใดที่พัฒนา Unix ได้ มันเป็นกระบวนการชุมชนที่ทั้งอาสาสมัครและ บริษัท เข้าร่วม เอนทิตีเหล่านี้ไม่ได้แบ่งปันเครื่องมือทั้งหมดของตนเสมอดังนั้นจึงมีการแยกเปลือกหอย เมื่อถึงเวลาที่เรารู้ว่าตัวนับการผลิตนี้มันสายเกินไปที่จะรวมกระสุนทั้งหมดที่ใช้งาน แต่การทำงานได้รับการดำเนินการเพื่อให้มั่นใจว่าเปลือกหอยทั้งหมดเหล่านี้จะเป็น (ทฤษฎี) เข้ากันได้กับอีกคนหนึ่ง

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


2

เชลล์ที่แตกต่างกันมีเหตุผลเดียวกันกับเว็บเบราว์เซอร์ที่แตกต่างกัน: ทุกคนมีการตั้งค่าและบางเชลล์มีสัมภาระหรือโมเมนตัมทางประวัติศาสตร์ แต่ละคนมีคุณสมบัติและนิสัยแปลกแตกต่างกันไป


1

ประวัติส่วนใหญ่ ...

Bourne ได้รับการพัฒนาเป็นส่วนหนึ่งของ (ความเหมาะสม) SysV Unix ในขณะที่ BSD ใช้csh... ต่อมาทุบตีได้รับการพัฒนาเป็นทางเลือกโอเพนซอร์ซกับบอร์นเชลล์ (และเวอร์ชั่นที่ปรับปรุงแล้วเช่น ksh) เชลล์ที่มีลักษณะคล้ายบอร์นถูกนำมาใช้ในมาตรฐาน POSIX ksh สอดคล้องกับมาตรฐานและสามารถใช้ bash ได้

เชลล์ชอบcshและtcshใช้งานแบบโต้ตอบได้ง่ายกว่าเชลล์เป้าหมายเดิม (ซึ่งขาดคำสั่ง ฯลฯ ) แต่น่ากลัวสำหรับสคริปต์ ...

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

สำหรับการเขียนสคริปต์แบบพกพาคุณควรใช้ Bourne-Variant ที่สอดคล้องกับ POSIX และหลีกเลี่ยงการขยาย


3
-1 สำหรับการคิดว่าโลกเริ่มต้นที่ SysV เปลือกบอร์นได้รับการปล่อยตัวใน UNIX v7 ในปี 1977 หกปีก่อน SysV ได้รับการปล่อยตัว
Rob

@ Rob, s / ปี 1977 / ปี 1979 /
Stéphane Chazelas

ยุติธรรมมาก ... ประวัติ * ระวังค่อนข้างซับซ้อน ... ดูen.wikipedia.org/wiki/File:Unix_history-simple.svg
Gert van den Berg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.