อะไรคือความแตกต่างพื้นฐานระหว่างหอยหลัก * NIX? [ปิด]


52

อะไรคือความแตกต่างพื้นฐานระหว่างเชลล์หลัก * NIX และสถานการณ์ใดที่อาจพร้อมท์ให้คุณใช้อีกอันหนึ่ง? ฉันเข้าใจว่าบางอย่างอาจลงมาตามความต้องการของผู้ใช้ แต่ฉันเคยใช้ bash และฉันสนใจที่จะได้ยินว่าเชลล์อีกอันมีประโยชน์หรือไม่

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

คำตอบ:


52

สำหรับการใช้งานแบบโต้ตอบมีสอง contenders หลัก, ทุบตีและzshบวกล้าหลังtcshและผู้มาใหม่ปลา

  • Bash เป็นเชลล์อย่างเป็นทางการของโครงการ GNU และเชลล์เริ่มต้นในการกระจาย Linux ส่วนใหญ่ ในสิ่งอื่น ๆ ที่ไม่ได้มาพร้อมกับเชลล์แบบอินเตอร์แอคทีฟที่ดีซึ่งเป็นส่วนหนึ่งของการติดตั้งพื้นฐานฉันคิดว่า bash เป็นสิ่งที่ผู้คนมักจะเลือกในการเสริมแรงด้วยตนเอง ดูเพิ่มเติมเหตุใดจึงมีการทุบตีทุกที่ (มีข้อมูลประวัติศาสตร์จำนวนมาก)

  • Zsh มีคุณสมบัติเกือบทุกอย่างของการทุบตีและคุณสมบัติอื่น ๆ (มีประโยชน์!) ข้อเสียเปรียบหลักของมันคือการเป็นที่รู้จักน้อยซึ่งในทางปฏิบัติหมายความว่าคุณมีโอกาสน้อยที่จะพบว่ามันถูกติดตั้งในระบบที่มีคนอื่นตั้งไว้แล้วและมีเอกสารของบุคคลที่สามน้อยกว่าเกี่ยวกับเรื่องนี้ ดูเพิ่มเติมคุณใช้ zsh คุณลักษณะอะไรบ้าง , อะไรคือคุณสมบัติอยู่ใน zsh และหายไปจากทุบตีหรือในทางกลับกัน? .

  • Tcsh ครั้งหนึ่ง (จนถึงต้นปี 1990) เชลล์ที่มีคุณสมบัติการโต้ตอบที่ดีที่สุดเช่น csh รุ่นก่อน ที่ทำให้มันเป็นที่นิยมสำหรับการใช้งานแบบโต้ตอบ (แต่ไม่ใช่สำหรับการเขียนสคริปต์ ) Zsh ติดกับ tcsh และปรับปรุงให้ดีขึ้นอย่างรวดเร็วและทุบตีตามมา (เมื่อโปรแกรมเสร็จ) ในช่วงต้นยุค 2000 ในขณะที่ tcsh แทบจะไม่คืบหน้าใน 15 ปีที่ผ่านมา ดังนั้นจึงมีเหตุผลเล็กน้อยที่จะเรียนรู้ tcsh ในขณะนี้

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


สำหรับการเขียนสคริปต์มีหลายภาษาที่คุณอาจต้องการกำหนดเป้าหมายทั้งนี้ขึ้นอยู่กับวิธีการพกพาที่คุณต้องการให้สคริปต์ของคุณเป็น

  • สิ่งที่อ้างว่าเป็น Unix เหมือนมีบอร์นเปลือก -derived /bin/shเป็น ยังมีบางโฆษณาเชิงพาณิชย์รอบ ๆ ที่/bin/shไม่เป็นไปตามPOSIX

  • เกือบทุกตอนนี้ทำงานยูนิกซ์มีshปฏิบัติการที่มีอย่างน้อยสอดคล้องกับอย่างน้อย POSIX.2-1992 และมักจะอย่างน้อยPOSIX: 2001 ที่อาคา Unix เดี่ยว v3 เปลือกนี้อาจมีชีวิตอยู่ในไดเรกทอรีที่แตกต่างกันเช่นหรือ/usr/bin/posix /usr/xpg6/binเลเยอร์การจำลอง POSIX นั้นมีอยู่สำหรับทุกระบบที่มีพลังมากพอที่จะรองรับมันทำให้มันเป็นเป้าหมายที่น่าสนใจ

  • ระบบยูนิกซ์หลายคนมีksh93ซึ่งนำคุณลักษณะบางอย่างมีประโยชน์มากที่ POSIX SH ขาด (อาร์เรย์เชื่อมโยงอาร์เรย์ globs ขยาย ( *(foo), @(foo|bar), ... ), globs null ( ~(N)foo*), ... ) Ksh เป็นซอฟต์แวร์เชิงพาณิชย์ในช่วงแรก (กลายเป็นอิสระในปี 2000 หลังจากมีการตั้งค่านิสัยบางอย่าง) และมียูนิเซฟอิสระ (Linux, * BSD) จำนวนมากเข้าสู่นิสัยของการจัดหาโคลนฟรีที่มีอายุมากกว่า ( pdksh ) เท่านั้น . Pdksh กำลังได้รับการพลัดถิ่นโดยmkshนอก OpenBSD แต่แม้ mksh จะขาดคุณสมบัติการใช้งาน ksh93 ทั้งหมด วันนี้คุณไม่สามารถนับจำนวน ksh93 ที่มีอยู่ได้ทุกที่โดยเฉพาะบน Linux ที่ bash เป็นบรรทัดฐาน

  • Bashพร้อมใช้งานบน Linux เสมอ (ยกเว้นบางรุ่นที่ฝังอยู่) และบ่อยครั้งที่ unices อื่น ๆ มันมีคุณสมบัติที่มีประโยชน์ที่สุดของ ksh93 แม้ว่าบางครั้งจะมีรูปแบบที่แตกต่างออกไป

  • Zshมีคุณสมบัติที่เป็นประโยชน์ส่วนใหญ่ของ ksh93 และ bash ไวยากรณ์หลักของมันนั้นสะอาดกว่า แต่เข้ากันไม่ได้กับ Bourne ยกเว้น macOS ไม่ต้องพึ่งพา zsh ที่มีอยู่ในระบบที่คุณไม่ได้ติดตั้ง

  • สำหรับการเขียนสคริปต์ขั้นสูงมากขึ้นคุณสามารถเปิดให้Perlหรืองูหลาม ภาษาเหล่านี้มีโครงสร้างข้อมูลที่เหมาะสมคุณสมบัติการจัดการข้อความที่เหมาะสมการผสมผสานระหว่างกระบวนการที่เหมาะสมและกลไกการสื่อสารและห้องสมุดที่มีอยู่มากมาย ระบบยูนิกซ์ส่วนใหญ่มีทั้งระบบที่มาพร้อมกับ OS หรือติดตั้งโดยผู้ดูแลระบบ (เพราะมีสคริปต์ Perl และ Python จำนวนมากอยู่ในนั้นจึงเป็นระบบที่หายากที่ไม่มีอย่างน้อยหนึ่งตัว)


4
สำหรับการเขียนสคริปต์ฉันกำหนดเป้าหมายเส้นประ (ยกเว้นกรณีที่ฉันต้องการคุณสมบัติขั้นสูงของ bash) ซึ่งมีชุดคุณลักษณะที่น้อยที่สุดและเป็นการร้องเรียน posix สำหรับความเข้ากันได้สูงสุด (และมันก็เป็นไฟขนาดเล็กและรวดเร็ว)
Hildred

สุดยอดสารคดี! สองบันทึก อันดับแรกSolarisเป็นหนึ่งใน "Unices เชิงพาณิชย์ที่ซึ่ง / bin / sh ไม่สอดคล้องกับ POSIX" โดยเฉพาะมันใช้jsh(ซึ่งไม่ได้เปลือก Java!) ซึ่งขาดแทนค่าตัวแปรเหมือนและ${VAR#foo} ${VAR%bar}
Adam Katz

ประการที่สองtcshค่อนข้างเป็นที่นิยมในหมู่ผู้ใช้ UNIX ที่ได้เรียนรู้เทคนิคของพวกเขาก่อนที่ ~ กลาง 90s (ซึ่งเห็นการนำของทั้งสองbashและzsh) โดยเฉพาะอย่างยิ่งในหมู่พี่ UNIX + Cนักพัฒนาที่เริ่มต้นชีวิตด้วยcsh(การแจ้งเตือนที่ในcshอัฒจันทร์สำหรับCภาษา ซึ่งเป็นแรงบันดาลใจให้กับความแตกต่างจากกระสุนสไตล์ bourne) ดูเพิ่มเติมที่การเขียนโปรแกรม Csh ถือว่าเป็นอันตรายซึ่งฉันมักจะใช้สำหรับเคล็ดลับเกี่ยวกับ POSIX เวทย์มนตร์ลึก (นอกเหนือจากข้อโต้แย้งต่อต้าน csh)
Adam Katz

Mac OS X ไม่เคยเป็น "OS / X" (: และ zsh ไม่สามารถใช้ร่วมกับ Bourne ได้อย่างไร (ดียกเว้นสำหรับสิ่งที่ไม่ใช่การขยายคำที่แตกต่างกันออกไป)
SilverWolf

@seaturtle การขยายตัวของคำที่ไม่แตกต่างกันคือความแตกต่างที่สำคัญซึ่งจะทำให้แตกสคริปต์ sh จำนวนมากหากคุณพยายามเรียกใช้ด้วย zsh (ยกเว้นว่าคุณรัน zsh ในโหมดจำลอง sh / ksh)
Gilles 'หยุดความชั่วร้าย'

27

มีสองรสชาติพื้นฐานของเชลล์ sh (เช่น bash) และ csh (เช่น tcsh) สำหรับการใช้งานแบบอินเทอร์แอคทีฟส่วนใหญ่จะมาจากสิ่งที่คุณคุ้นเคย ฉันใช้ csh แล้ว tcsh เป็นเวลาหลายปีและมันจะเจ็บปวดที่จะเปลี่ยนเพียงเพราะฉันชินกับมัน ฉันใช้ทุบตีด้วยและฉันไม่คิดว่ามีเหตุผลที่น่าสนใจที่จะเปลี่ยน ยกเว้นบางทีถ้าอย่างใดอย่างหนึ่งไม่สามารถใช้ได้บนเครื่องที่คุณใช้เป็นประจำ

สำหรับการเขียนโปรแกรมไวยากรณ์ต่างกัน คุณไม่สามารถเปลี่ยนเชลล์ได้ แต่ต้องเปลี่ยนไวยากรณ์ของสคริปต์ด้วย สำหรับการเขียนสคริปต์คุณต้องการใช้ sh หรือ bash ไวยากรณ์มากขึ้นคล้อยตามสคริปต์ตามที่อธิบายไว้ที่นี่ (ขอบคุณRiccardo Murriสำหรับการเชื่อมโยง. เป็นดีคู่มือในการเขียนสคริปต์ทุบตี

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


12

ย้อนกลับไปในสมัยก่อนเมื่อ AT&T คิดค้น UNIX มี Bourne Shell เขียนโดย Steve Bourne มันค่อนข้างเรียบง่ายและขาดเครื่องมือมากมายที่เราได้รับในปัจจุบัน

AT&T ไม่ได้อยู่ในธุรกิจ UNIX ดังนั้นในเวลานี้ระบบปฏิบัติการพื้นฐานที่ Berkelely นำมาใช้ค่อนข้างมากและพวกเขาทำการเปลี่ยนแปลงบางอย่างใน BSD UNIX ท่ามกลางการเปลี่ยนแปลงหลายอย่างเชลล์ใหม่ที่เรียกว่า csh ซึ่งมีการปรับปรุงมากมายเกี่ยวกับ sh รวมถึงการควบคุมการใช้งานแบบอินเตอร์แอคทีฟที่ดีขึ้นเป็นต้น น่าเสียดายที่พวกเขาตัดสินใจว่าไวยากรณ์การเขียนโปรแกรม sh ถูกดูดและสร้างขึ้นเอง (ค่อนข้างแย่) คัดลอกมาจากรูปแบบการเข้ารหัส C (คำโหยหวนคลาสสิกคือhttp://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ ) ดังนั้นตอนนี้ก็มีสองไวยากรณ์

ต่อมาพวกเขาปรับปรุง CSH เพื่อเพิ่มความสมบูรณ์ของแท็บและสิ่งอื่น ๆ นี่กลายเป็น tcsh และถ้าคุณใช้ CSH นี่น่าจะเป็นสิ่งที่คุณใช้

AT&T ตัดสินใจว่ามันไม่ได้ออกมาจากธุรกิจยูนิกซ์ทั้งหมดและพวกเขาก็ขัดเกลามันเช่นกัน David Korn (คนดี) สร้าง Korn Shell ตามแนวคิดของการขยาย Bourne shell syntax มันได้เพิ่มสิ่งต่าง ๆ มากมายสำหรับทั้งโปรแกรมเมอร์และการใช้แบบโต้ตอบ จริงๆแล้วมีสองสามเวอร์ชันและคุณอาจไม่ค่อยเห็นสิ่งต่าง ๆ เช่น ksh88 และ ksh93 แสดงถึงความหลากหลาย

จากนั้น FSF และ GNU OS ก็มาถึง พวกเขาต้องการสร้างระบบปฏิบัติการที่รองรับ UNIX ที่ชื่อ Hurd และต้องการเชลล์ที่ดีกว่าสำหรับมัน พวกเขาเรียกว่า bash สำหรับ Bourne Again SHell กฎ POSIX มาในเวลาเพียงช่วงเวลานี้และพวกเขาต้องการที่จะทำให้เปลือก POSIX พวกเขามองไปรอบ ๆ การใช้ไวยากรณ์จากบอร์นเชลล์และการปรับปรุงจาก Korn เชลล์รวมถึงการขโมยและขยายคุณสมบัติการโต้ตอบจาก tcsh มันกลายเป็นเปลือกพฤตินัยบน Linux ดังนั้นจึงเป็นเรื่องธรรมดามาก

นอกจากนี้ยังมี zsh เขียนเป็นเชลล์ 'ultimate' นอกจากนี้ยังพบได้ทั่วไปในโลก Linux มันขยาย bash (และผสมเรณูเล็กน้อยสิ่งใหม่บางอย่างก็กลับไปทุบตี)

ถ้าฉันจะเลือกเปลือกฉันจะเลือกทุบตีหรือ zsh ทุบตีอาจอยู่ในสถานที่ไม่กี่ zsh กว่า zsh มีพลังมากกว่า แต่ทุบตีก็ดีสำหรับฉัน เชลล์บอร์น / bin / sh ของแท้นั้นอยู่รอบตัวด้วยเหตุผลทางประวัติศาสตร์ ทุบตีมีทุกอย่างที่ ksh มีให้และอื่น ๆ อีกมาก ไวยากรณ์นั้นสะอาดกว่า csh หรือ tcsh และมีคุณสมบัติที่ดีกว่าหนึ่งในนั้น

ในการแปลงสคริปต์จะขึ้นอยู่กับว่าจะเป็นอะไร สไตล์เชลล์เป้าหมาย (sh, ksh, bash, zsh) ถึงหรือจากสไตล์ csh (csh, tcsh) จะยาก การเปลี่ยนจากเก่าไปเป็นใหม่ (/ bin / sh => bash, / bin / ksh => zsh) จะง่ายกว่าวิธีอื่น


โปรดทราบว่าหน้า csh-whynot ถูกเขียนขึ้นในเดือนกันยายน 1995 (ตรวจสอบแท็กเวอร์ชันที่ด้านบน) ฉันไม่รู้ แต่ฉันคาดว่าหลายสิ่งหลายอย่างจะเปลี่ยนไปใน 18 ปีหลังจากนั้น
CVn

8

เปลือกหอยทั้งสองสาขาหลักคืออนุพันธ์เชลล์บอร์น (sh, bash, ksh, ash, yash และ zsh) และอนุพันธ์ csh (tcsh และ ... uhm ... tcsh)

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

สิ่งที่ส่วนใหญ่เขียนในอนุพันธ์เปลือก bourne หนึ่งอาจจะทำงานในคนอื่น ๆ สิ่งส่วนใหญ่ที่เขียนในเชลล์เป้าหมายจะต้องได้รับการแก้ไขให้ทำงานภายใต้ csh หรือ tcsh

ส่วนตัวฉันใช้ ksh เมื่อฉันเริ่มต้นเพราะนั่นคือสิ่งที่อยู่ในระบบที่ฉันใช้ ตอนนี้ฉันใช้ทุบตีเป็นส่วนใหญ่


1
ปลาเป็นหอยที่ได้แรงบันดาลใจจาก csh
hildred

1

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

ฉันคิดว่า zsh มีตัวเลือกการปรับแต่งเพิ่มเติมอย่างน้อยก็เคยเป็นมา แต่หลังจากใช้มาหลายปีแล้วฉันก็พอแล้วสำหรับปัญหาความเสถียรและการเข้ารหัสอักขระ ทุบตีเป็นหินแข็งไม่เคยมีปัญหาที่คล้ายกันและติดตั้งทุกที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.