การใช้งานร่วมกันได้หมายถึงอะไร


63

ฉันเคยเห็นคำว่า "sh Compatible" ที่ใช้โดยทั่วไปแล้วในการอ้างอิงถึง shells ฉันไม่แน่ใจว่ามันใช้กับโปรแกรมที่อาจถูกเรียกใช้จากภายใน shells หรือไม่

เชลล์หรือโปรแกรมอื่นมีความหมายว่าอะไร "sh Compatible" การที่ "ขัดกันไม่ได้" หมายความว่าอย่างไร?

แก้ไข: คำถามนี้ถามความแตกต่างระหว่าง bash และ sh เกี่ยวข้องกันมาก: ความแตกต่างระหว่าง sh และ bash

ฉันยังต้องการคำตอบโดยตรงกับความหมายของคำว่า "เข้ากันได้กับ sh" ความคาดหวังที่สมเหตุสมผลอาจเป็นได้ว่า "sh Compatible" หมายถึง "ใช้ภาษาคำสั่งของเชลล์" แต่ทำไมจึงมีเชลล์ "sh ที่เข้ากันได้" จำนวนมากและทำไมมันถึงแตกต่างกัน?


1
สำหรับเชลล์สคริปต์นั้นอ้างถึงว่าสคริปต์นั้นใช้ไวยากรณ์ที่เข้ากันได้ (รันได้) กับ Bourne Shell ( sh) หรือไม่ สำหรับเชลล์ที่แตกต่างมันอ้างถึงว่าเชลล์นั้นสามารถรันสคริปต์เชลล์เป้าหมายได้หรือไม่
HalosGhost

หากคุณต้องการเรียนรู้นักประดิษฐ์เปลือกหอยคุณสามารถเยี่ยมชมคำตอบของฉันได้ที่unix.stackexchange.com/questions/45684/…
PersianGulf

คำตอบ:


116

ทำไมมีเปลือกหอย "sh ที่เข้ากันได้" มากมาย?

เปลือกบอร์นเป็นครั้งแรกต่อสาธารณชนได้รับการปล่อยตัวในปี 1979 เป็นส่วนหนึ่งของระบบปฏิบัติการยูนิกซ์ V7 เนื่องจากระบบ Unix และ Unix ที่มีลักษณะคล้ายกันมากนั้นสืบทอดมาจาก V7 Unix - แม้ว่าจะเป็นเพียงฝ่ายวิญญาณเชลล์ Bourne อยู่กับเราตลอดไป "ตลอดไป"

เปลือก Bourne จริงแทนที่เปลือกก่อนหน้านี้ retronymed เปลือก Thompsonแต่มันเกิดขึ้นเร็วในประวัติศาสตร์ของ Unix ว่ามันทั้งหมด แต่ลืมวันนี้ Bourne shell เป็น superset ของ Thompson shell

ทั้งบอร์นและ ธ shอมป์สันเปลือกหอยที่ถูกเรียกว่า เปลือกระบุโดย POSIXshจะเรียกว่า ดังนั้นเมื่อมีคนบอกว่า - ใช้งานร่วมshกันได้พวกมันจะอ้างถึงเปลือกหอยแบบนี้ด้วยมือ หากพวกเขาต้องการที่เฉพาะเจาะจงพวกเขาจะพูดว่า "POSIX shell" หรือ "Bourne shell" ³

POSIX เชลล์ใช้KornShellเวอร์ชัน 1988 ซึ่งจะหมายถึงการแทนที่เชลล์เป้าหมายใน AT&T Unix กระโดดข้ามBSD C เชลล์ในแง่ของคุณสมบัติ features ในระดับที่kshเป็นบรรพบุรุษของเชลล์ POSIX ส่วนใหญ่ ระบบที่เหมือน Unix และ Unix นั้นรวมถึง Korn เชลล์บางรุ่นในปัจจุบัน ข้อยกเว้นเป็นระบบฝังตัวขนาดเล็กซึ่งไม่สามารถหาพื้นที่สำหรับ POSIX เชลล์ที่สมบูรณ์ได้

ที่กล่าวว่า Korn shell - ซึ่งแตกต่างจาก POSIX shell - ไม่เคยเป็นที่นิยมนอกโลก Unix เชิงพาณิชย์ เพราะนี่คือการเพิ่มขึ้นของมันตรงกับช่วงปีแรกของการค้ายูนิกซ์จึงถูกจับได้ในสงครามยูนิกซ์ BSD Unixes หลีกเลี่ยงการใช้งาน C เชลล์และซอร์สโค้ดของมันก็ไม่สามารถใช้งานได้อย่างอิสระใน Linux เมื่อมันเริ่มต้นขึ้นดังนั้นเมื่อผู้จัดจำหน่าย Linux รุ่นแรกออกไปหาเชลล์คำสั่งเพื่อไปกับเคอร์เนล Linux พวกเขามักจะเลือกGNU Bashซึ่งเป็นหนึ่งใน - shองค์ประกอบที่คุณกำลังพูดถึง

ว่าสมาคมระหว่างต้น Linux และทุบตีปิดผนึกสวยมากชะตากรรมของเปลือกหอยอื่น ๆ อีกมากมายรวมทั้งksh, และcsh tcshยังมีคนตายอีกจำนวนมากที่ยังใช้กระสุนเหล่านี้ในวันนี้

ทั้งหมดนี้ประวัติศาสตร์จะอธิบายว่าทำไมผู้สร้างของเด็ดญาติเช่นbash, zshและyashเลือกที่จะทำให้พวกเขาshเข้ากันได้: บอร์น / POSIX เข้ากันได้เป็นอย่างน้อยเปลือกสำหรับระบบปฏิบัติการ Unix เหมือนจะต้องให้อยู่ในลำดับที่จะได้รับการยอมรับอย่างกว้างขวาง

ในหลาย ๆ ระบบเชลล์คำสั่งแบบโต้ตอบเริ่มต้นและ/bin/shแตกต่างกัน /bin/shอาจจะ:

  • เชลล์เป้าหมายเดิม นี่เป็นเรื่องปกติในระบบ UNIX ที่เก่ากว่าเช่น Solaris 10 (เปิดตัวในปี 2005) และรุ่นก่อนหน้า⁸

  • เชลล์ที่ได้รับการรับรอง POSIX นี่เป็นเรื่องปกติในระบบ UNIX ที่ใหม่กว่าเช่น Solaris 11 (2010)

  • เปลือก Almquist นี้เป็นแหล่งเปิดบอร์น / POSIX เปลือกโคลนสร้างสรรค์บน Usenet ในปี 1989ซึ่งเป็นผลจากนั้นไปที่เบิร์กลีย์CSRGเพื่อรวมไว้ในการเปิดตัวครั้งแรกที่มี BSD ไม่มี AT & T ซอร์สโค้ด4.4BSD-Lite Almquist เปลือกมักจะเรียกว่าแม้ในขณะที่การติดตั้งเป็นash/bin/sh

    4.4BSD-Lite กลายเป็นฐานสำหรับตราสารอนุพันธ์ BSD ที่ทันสมัยทั้งหมดโดย/bin/shส่วนที่เหลือเป็นอนุพันธ์ของ Almquist ส่วนใหญ่โดยมีข้อยกเว้นหลักประการหนึ่งที่ระบุไว้ด้านล่าง คุณสามารถเห็นการสืบทอดโดยตรงในที่เก็บซอร์สโค้ดสำหรับNetBSDและFreeBSD : พวกเขาจัดส่งอนุพันธ์เชลล์ Almquist จากวันที่ 1

    มีสองashส้อมที่สำคัญนอกโลก BSD:

    1. dashซึ่งได้รับการรับรองอย่างดีจาก Debian และ Ubuntuในปี 2549 เป็นการ/bin/shใช้งานเริ่มต้น (Bash ยังคงเป็นเชลล์คำสั่งเริ่มต้นแบบโต้ตอบในอนุพันธ์ของ Debian)

    2. ashคำสั่งในBusyBoxซึ่งมักจะถูกใช้ใน Linuxes /bin/shฝังตัวและอาจถูกนำมาใช้ในการดำเนินการ เนื่องจากมันโพสต์วันที่dashและมาจากashแพคเกจเก่าของ Debianฉันจึงเลือกที่จะพิจารณาว่ามันเป็นอนุพันธ์ของdashมากกว่าที่ashจะใช้แม้ว่าจะมีชื่อคำสั่งภายใน BusyBox

      (BusyBox นอกจากนี้ยังมีทางเลือกที่ featureful น้อยที่จะashเรียกว่าhush. โดยปกติเพียงคนเดียวของทั้งสองจะได้รับการสร้างขึ้นในที่ใดก็ตาม BusyBox ไบนารี: ashโดยเริ่มต้น แต่hush. เมื่อมีพื้นที่มันแน่นดังนั้น/bin/shในระบบ BusyBox ตามไม่ได้เสมอdash. เหมือน)

  • GNU ทุบตีซึ่งปิดการใช้งานส่วนใหญ่ของส่วนขยายที่ไม่ใช่ POSIX shเมื่อเรียกว่าเป็น

    ตัวเลือกนี้เป็นปกติบนเดสก์ท็อปและเซิร์ฟเวอร์ตัวแปรของ Linux ยกเว้น Debian และอนุพันธ์ Mac OS X ก็ทำเช่นนี้ตั้งแต่ Panther เปิดตัวในปี 2003

  • เปลือกหอยที่มีksh93ส่วนขยาย POSIXเช่นใน OpenBSD แม้ว่าเชลล์ OpenBSD จะเปลี่ยนพฤติกรรมเพื่อหลีกเลี่ยงไวยากรณ์และความไม่ลงรอยกันทางความหมายกับเชลล์ Bourne และ POSIX เมื่อเรียกว่าshแต่จะไม่ปิดใช้งานส่วนขยายที่บริสุทธิ์ใด ๆ ซึ่งเป็นสิ่งที่ไม่ขัดแย้งกับเชลล์ที่เก่ากว่า

    สิ่งนี้ไม่ธรรมดา คุณไม่ควรคาดหวังคุณสมบัติในksh93/bin/sh

ฉันใช้ "shell script" ด้านบนเป็นคำทั่วไปหมายถึง Bourne / POSIX shell scripting นี่เป็นเพราะความแพร่หลายของกระสุนตระกูล Bourne หากต้องการพูดคุยเกี่ยวกับการเขียนสคริปต์บนเชลล์อื่นคุณต้องระบุ qualifier เช่น "C shell script" แม้ในระบบที่เชลล์ตระกูล C เป็นเชลล์แบบโต้ตอบเริ่มต้นจะเป็นการดีกว่าถ้าใช้เชลล์เป้าหมายสำหรับการเขียนสคริปต์

มีคนบอกว่าเมื่อวิกิพีเดียจำแนกเชลล์ Unixพวกมันจะจัดกลุ่มพวกมันเข้ากันได้กับ Bourne shell, เข้ากันได้กับ C เชลล์และ "อื่น ๆ "

แผนภาพนี้อาจช่วย:

The Unix Shells: Bourne, Korn, POSIX, C และ rc Shell Families

(คลิกสำหรับรุ่น SVG, 31 kB หรือดูรุ่น PNG ขนาดเต็ม , 218 kB)

การที่ "ขัดกันไม่ได้" หมายความว่าอย่างไร?

มีคนพูดถึงshสิ่งที่เข้ากันไม่ได้โดยทั่วไปหมายถึงหนึ่งในสามสิ่ง:

  1. พวกเขาอ้างถึงหนึ่งในเปลือกหอย "อื่น ๆ " เหล่านั้น

  2. พวกมันสร้างความแตกต่างระหว่างตระกูลเชลล์เป้าหมายและซีเชลล์

  3. พวกเขากำลังพูดถึงคุณสมบัติบางอย่างในเชลล์ตระกูล Bourne หนึ่งที่ไม่ได้อยู่ในเชลล์ตระกูล Bourne อื่นทั้งหมด ksh93, bashและzshโดยเฉพาะมีคุณสมบัติมากมายที่ไม่มีอยู่ในเชลล์ "มาตรฐาน" รุ่นเก่า ทั้งสามนั้นยังไม่สามารถใช้ร่วมกันได้ในหลายวิธีเมื่อคุณได้รับเกิน POSIX / ksh88ฐานที่ใช้ร่วมกัน

เป็นข้อผิดพลาดแบบคลาสสิกในการเขียนเชลล์สคริปต์ด้วย#!/bin/sh บรรทัด Shebangที่ด้านบน แต่เพื่อใช้ส่วนขยายของ Bash หรือ Korn เชลล์ภายใน เนื่องจาก/bin/shเป็นหนึ่งในของเปลือกหอยในแผนภาพครอบครัว Korn / POSIX ดังกล่าวข้างต้นในระบบจำนวนมากดังนั้นวันนี้สคริปดังกล่าวจะทำงานบนระบบที่พวกเขาจะเขียนไว้ใน แต่แล้วล้มเหลวในระบบที่/bin/shเป็นสิ่งที่มาจากครอบครัวบอร์นที่กว้างขึ้นของเปลือกหอย แนวทางปฏิบัติที่ดีที่สุดคือการใช้#!/bin/bashหรือ#!/bin/kshเส้น Shebang หากสคริปต์ใช้ส่วนขยายดังกล่าว

มีหลายวิธีในการตรวจสอบว่าสคริปต์เชลล์ตระกูล Bourne ที่กำหนดเป็นแบบพกพาหรือไม่:

  • เรียกใช้checkbashismsเครื่องมือจากโครงการ Debian ที่ตรวจสอบสคริปต์สำหรับ " bashisms "

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

  • ทำงานได้ภายใต้oshจากเครื่องมือ Schily โครงการรุ่นที่ดีขึ้นของบอร์นเปลือกเปิด sourced โดยดวงอาทิตย์เป็นส่วนหนึ่งของ OpenSolaris ในปี 2005 ทำให้มันเป็นหนึ่งในวิธีที่ง่ายที่สุดที่จะได้รับรูปแบบ 1979 บอร์นเปลือกบนคอมพิวเตอร์ที่ทันสมัย

    การกระจายเครื่องมือ Schily ยังรวมถึงboshเปลือกชนิด POSIX ที่มีคุณสมบัติที่ไม่เป็นมาตรฐานหลายอย่างแต่อาจมีประโยชน์สำหรับการทดสอบความเข้ากันได้ของเชลล์สคริปต์ที่มีจุดประสงค์เพื่อใช้กับเชลล์ตระกูล POSIX ทั้งหมด มันมีแนวโน้มที่จะอนุรักษ์นิยมมากขึ้นในลักษณะของการตั้งค่ากว่าbash, และรุ่นที่เพิ่มขึ้นของzshksh93

    เครื่องมือ Schily ยังรวมถึงเชลล์ที่เรียกว่าbshแต่นั่นเป็นสิ่งที่แปลกประหลาดทางประวัติศาสตร์ซึ่งไม่ใช่เชลล์ตระกูล Bourne เลย

  • ผ่านแบบพกพาเชลล์การเขียนโปรแกรมบทในคู่มือ GNU Autoconf คุณอาจรู้จักโครงสร้างที่มีปัญหาซึ่งมันพูดถึงในสคริปต์ของคุณ

ทำไมพวกเขาถึงแตกต่างกัน

ด้วยเหตุผลเดียวกันทั้งหมด "ใหม่ & ปรับปรุงแล้ว" สิ่งที่แตกต่าง:

  • รุ่นที่ปรับปรุงแล้วสามารถปรับปรุงได้โดยการทำลายความเข้ากันได้แบบย้อนหลังเท่านั้น

  • บางคนคิดว่าวิธีที่แตกต่างสำหรับการทำงานซึ่งพวกเขาชอบดีกว่า แต่ก็ไม่ใช่วิธีเดียวกับที่คนเก่าทำงาน

  • มีคนพยายามนำมาตรฐานเก่ามาใช้ใหม่โดยไม่เข้าใจอย่างสมบูรณ์ดังนั้นจึงทำให้เกิดความสับสนและสร้างความแตกต่างโดยไม่ได้ตั้งใจ


เชิงอรรถและผู้ช่วย :

  1. BSD Unix เวอร์ชันก่อนหน้าเป็นเพียงส่วนเสริมซอฟต์แวร์สำหรับ V6 Unix เนื่องจากเชลล์ Bourne ไม่ได้ถูกเพิ่มใน AT&T Unix จนกระทั่ง V7 BSD ไม่ได้เริ่มต้นจากการมีเชลล์เป้าหมายในทางเทคนิค คำตอบของ BSD ธรรมชาติดั้งเดิมของเปลือก ธ อมป์สันเป็นเปลือก C

    แต่รุ่นแรกของแบบสแตนด์อโลน BSD (2.9BSD และ 3BSD) อยู่บนพื้นฐานของ V7 หรือทายาทแบบพกพาUNIX / 32Vเพื่อให้พวกเขาได้รวมถึงบอร์นเปลือก

    (สาย 2BSD กลายเป็นส้อมขนาน BSD สำหรับดิจิตอลminicomputers PDPขณะที่ 3BSD และ 4BSD สายไปในการใช้ประโยชน์จากคอมพิวเตอร์ชนิดใหม่เช่นVaxenและยูนิกซ์เวิร์กสเตชัน 2.9BSD เป็นหลักรุ่น PDP ของ 4.1cBSD. พวกเขาอยู่ สมัยและรหัสที่ใช้ร่วมกัน . ปิดด้วยชั้นไม่ได้เพียงแค่หายไปเมื่อมาถึง VAX ดังนั้นบรรทัด 2BSD จะยังคง เผ่นแผล็ว พร้อม .)

    มันปลอดภัยที่จะกล่าวว่า Bourne shell นั้นมีอยู่ทุกหนทุกแห่งในโลก Unix ในปี 1983 นั่นเป็นการประมาณที่ดีสำหรับ "ตลอดไป" ในอุตสาหกรรมคอมพิวเตอร์ MS-DOS มีระบบแฟ้มลำดับชั้นว่าปี (awww วิธี cuuute!) และเป็นครั้งแรก24 บิตแมคอินทอชกับ 9" B & W หน้าจอ - ไม่สีเทาตัวอักษรสีดำและสีขาว - จะไม่ออกมาจนถึงต้นปีหน้า

  2. เปลือกของ Thompson นั้นค่อนข้างดั้งเดิมตามมาตรฐานของทุกวันนี้ มันเป็นเพียงเปลือกคำสั่งแบบโต้ตอบมากกว่าสภาพแวดล้อมการเขียนโปรแกรมสคริปต์ที่เราคาดหวังในวันนี้ มันมีสิ่งต่าง ๆ เช่นไปป์และการเปลี่ยนเส้นทาง I / O ซึ่งเราคิดว่าเป็นส่วนหนึ่งของ "Unix shell" ซึ่งทำให้เราคิดว่าMS-DOS เป็นคำสั่งที่ได้มาจาก Unix

    The Bourne เปลือกยังแทนที่เปลือก PWBซึ่งเพิ่มสิ่งที่สำคัญที่ ธ อมป์สันเปลือกเช่นการเขียนโปรแกรม ( if, switchและwhile) และรูปแบบของตัวแปรสภาพแวดล้อม เปลือก PWB จำได้ดีกว่าเปลือก Thompson เนื่องจากมันไม่ได้เป็นส่วนหนึ่งของ Unix ทุกรุ่น

  3. เมื่อใครบางคนไม่เฉพาะเจาะจงเกี่ยวกับความเข้ากันได้ของ POSIX กับ Bourne shell มีหลายสิ่งที่พวกเขาอาจหมายถึง

    ที่สุดขั้วหนึ่งพวกเขาสามารถใช้เชลล์บอร์น 2522 เป็นพื้นฐาน เป็น " shสคริปต์ใช้ได้กับระบบปฏิบัติการ" ในความรู้สึกนี้จะหมายถึงการคาดว่าจะทำงานอย่างสมบูรณ์ในบอร์นเชลล์จริงหรือใด ๆ ของผู้สืบทอดและโคลนนิ่ง: ash, bash, ksh, zshฯลฯ

    บางคนที่สุดโต่งอื่น ๆ จะถือว่าเชลล์ที่ระบุโดย POSIX เป็นพื้นฐานแทน เราใช้คุณสมบัติ POSIX เชลล์หลายอย่างในฐานะ "มาตรฐาน" ทุกวันนี้ที่เรามักจะลืมไปว่ามันไม่ได้อยู่ในบอร์นเชลล์: ในตัวคณิตศาสตร์, การควบคุมงาน, ประวัติคำสั่ง, นามแฝง, การแก้ไขบรรทัดคำสั่ง, $()รูปแบบของคำสั่ง การทดแทน ฯลฯ

  4. แม้ว่า Korn shell นั้นมีรากฐานมาตั้งแต่ต้นทศวรรษ 1980 AT&T ไม่ได้ส่งในระบบปฏิบัติการ Unix จนกระทั่งSystem V Release 4ในปี 1988 เนื่องจาก Unixes เชิงพาณิชย์จำนวนมากใช้ SVR4 สิ่งนี้ทำให้kshUnix เชิงพาณิชย์ทุกตัวที่เกี่ยวข้องจาก ปลายยุค 80 เป็นต้นไป

    (รสชาติ Unix แปลก ๆ ไม่กี่ตัวบนพื้นฐานของSVR3และก่อนหน้านี้ถูกนำไปวางไว้บนส่วนต่าง ๆ ของตลาดผ่านการเปิดตัว SVR4 แต่พวกเขาเป็นคนแรกที่ต่อต้านกำแพงเมื่อการปฏิวัติมาถึง)

    ปี 1988 เป็นปีที่POSIX มาตรฐานแรกออกมาด้วย Korn เชลล์ที่ใช้ "POSIX shell" ต่อมาในปี 1993 รุ่น Korn shell ที่ปรับปรุงแล้วออกมา เนื่องจาก POSIX จับภาพต้นฉบับได้อย่างมีประสิทธิภาพโดยkshแยกออกเป็นสองรุ่นใหญ่: ksh88และksh93ตั้งชื่อหลังจากหลายปีที่เกี่ยวข้องกับการแยก

    ksh88ไม่รองรับ POSIX ทั้งหมดแม้ว่าความแตกต่างจะมีขนาดเล็กดังนั้นksh88เชลล์บางรุ่นจะได้รับการติดตั้งเพื่อให้เข้ากันได้กับ POSIX (จากการสัมภาษณ์ Slashdot ที่น่าสนใจกับดร. David G. Kornใช่คนที่เขียนเปลือก)

    ksh93เป็นซูเปอร์อย่างเต็มที่ที่เข้ากันได้ของเปลือก POSIX การพัฒนาksh93ดำเนินไปเป็นระยะ ๆตั้งแต่แหล่งเก็บข้อมูลหลักย้ายจาก AT&T ไปยัง GitHubด้วยการเปิดตัวรุ่นใหม่ล่าสุดมีอายุประมาณ 3 ปีเมื่อฉันเขียนสิ่งนี้ ksh93v (ชื่อฐานของโครงการยังคงksh93มีส่วนต่อท้ายที่เพิ่มเข้ามาเพื่อแสดงถึงรุ่นที่วางจำหน่ายหลังปี 1993)

    ระบบที่รวม Korn เชลล์เป็นสิ่งที่แยกจาก POSIX เชลล์มักจะทำให้มันพร้อมใช้งาน/bin/kshแม้ว่าบางครั้งมันจะซ่อนอยู่ที่อื่น

    เมื่อเราพูดถึงkshหรือ Korn เชลล์ตามชื่อเรากำลังพูดถึงksh93คุณสมบัติที่แยกความแตกต่างจากชุดย่อย Bourne และ POSIX เชลล์ที่เข้ากันได้แบบย้อนหลัง คุณไม่ค่อยวิ่งข้ามบริสุทธิ์ksh88ในวันนี้

  5. AT & T เก็บเปลือกกรรหัสที่มาเป็นกรรมสิทธิ์จนถึงมีนาคม 2000 จากจุดนี้การเชื่อมโยงของ Linux กับ GNU Bash นั้นแข็งแกร่งมาก ทุบตีและksh93 แต่ละคนมีข้อได้เปรียบกว่าคนอื่น ๆแต่ ณ จุดนี้ความเฉื่อยทำให้ Linux เชื่อมโยงอย่างแน่นหนากับ Bash

    ว่าทำไมผู้ขายลินุกซ์ในช่วงต้นมากที่สุดเลือก GNU ทุบตีมากกว่าpdkshที่เป็นอยู่ในเวลาลินุกซ์ได้รับการเริ่มต้นผมคิดว่ามันเป็นเพราะมากของส่วนที่เหลือของ userland ยังมาจากโครงการ GNU Bash ค่อนข้างสูงกว่าpdkshเนื่องจากผู้พัฒนา Bash ไม่ได้ จำกัด ตัวเองในการคัดลอก Korn เชลล์คุณสมบัติ

    pdkshหยุดการทำงานเมื่อเวลาที่ AT&T เผยแพร่ซอร์สโค้ดไปยัง Korn เชลล์จริง มีสองงาหลักที่ยังคงรักษาอย่างไรคือ: OpenBSD pdkshและMirBSD Korn mkshShell,

    ฉันพบว่ามันน่าสนใจที่mkshเป็นการนำ Korn shell ไปใช้งานเท่านั้นที่ถูกบรรจุใน Cygwin

  6. GNU Bash ก้าวล้ำกว่า POSIX ในหลาย ๆ ด้าน แต่คุณสามารถขอให้มันรันในโหมด POSIX ที่บริสุทธิ์กว่า

  7. csh/ tcshมักจะเป็นเปลือกโต้ตอบเริ่มต้นใน BSD Unixes จนถึงต้นปี 1990

    เป็นตัวแปร BSDรุ่นแรกของ Mac OS X เป็นวิธีนี้ผ่าน Mac OS X 10.2 "จากัวร์" OS X เปลี่ยนเปลือกเริ่มต้นจากtcshการทุบตีในOS X 10.3 "เสือดำ" การเปลี่ยนแปลงนี้ไม่มีผลกับระบบที่อัพเกรดจาก 10.2 หรือก่อนหน้า ผู้ใช้ที่มีอยู่ในระบบที่แปลงเหล่านั้นเก็บtcshเชลล์ไว้

    FreeBSD อ้างว่าจะยังคงใช้tcshเป็นเปลือกเริ่มต้นแต่ใน FreeBSD 10 VM ฉันมีที่นี่เปลือกเริ่มต้นดูเหมือนจะเป็นหนึ่งใน POSIX ได้Almquist สายพันธุ์เปลือก สิ่งนี้เป็นจริงใน NetBSD เช่นกัน

    OpenBSD ใช้การแยกpdkshเป็นเปลือกเริ่มต้นแทน

    ความนิยมที่สูงขึ้นของ Linux และ Mac OS X ทำให้บางคนต้องการ FreeBSD ก็จะเปลี่ยนไปทุบตี แต่พวกเขาจะไม่สามารถทำเช่นนั้นเวลาเร็ว ๆ นี้สำหรับเหตุผลปรัชญา มันง่ายที่จะเปลี่ยนถ้ามันรบกวนจิตใจคุณ

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

    ฉันรู้เพียงวิธีหนึ่งที่จะเรียกใช้ของแท้ 1979 บอร์นเชลล์วินเทจบนคอมพิวเตอร์ที่ทันสมัย: ใช้โบราณ Unix V7ภาพดิสก์กับSIMH PDP-11 จำลองจากโครงการคอมพิวเตอร์จำลองประวัติศาสตร์ SIMH ทำงานบนคอมพิวเตอร์ที่ทันสมัยทุกเครื่องไม่ใช่เพียงแค่คอมพิวเตอร์ที่ใช้ Unix SIMH แม้รันบน Androidและบน iOS

    ด้วยOpenSolaris , ซันโอเพนซอร์สรุ่น SVR4 ของเปลือกบอร์นเป็นครั้งแรก ก่อนหน้านั้นรหัสแหล่งที่มาสำหรับ Bourne shell รุ่น post-V7 นั้นมีให้เฉพาะกับผู้ที่มีสิทธิ์ใช้งานซอร์สโค้ด Unix เท่านั้น

    ขณะนี้โค้ดดังกล่าวสามารถใช้งานแยกต่างหากจากส่วนที่เหลือของโปรเจ็กต์ OpenSolaris ที่หมดอายุจากแหล่งต่าง ๆ สองแหล่ง

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

    Jörg Schilling ทำงานได้ดีขึ้นในการรักษาเวอร์ชันของรหัสนี้oshในแพ็คเกจSchily Toolsของเขา ดูด้านบนสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้

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

    วิธีการหนึ่งที่จะบอกว่าคุณอยู่ในต้นฉบับบอร์นเปลือกคือเพื่อดูว่าจะสนับสนุนคุณลักษณะที่ไม่มีเอกสารเพิ่มเพื่อความสะดวกในการเปลี่ยนแปลงจากเปลือก ธ อมป์สัน: เป็นชื่อแทนสำหรับ^ |กล่าวคือคำสั่งเช่นls ^ moreจะให้ข้อผิดพลาดในเปลือกประเภท Korn หรือ POSIX แต่มันจะทำงานเหมือนls | moreบนเชลล์เป้าหมายที่แท้จริง

  9. บางครั้งคุณพบfish, scshหรือrc/esพรรคพวก แต่พวกเขากำลังแม้ยากยิ่งกว่า C แฟนเปลือก

    rcครอบครัวของเปลือกหอยไม่นิยมใช้ในระบบ Unix / Linux แต่ครอบครัวที่มีความสำคัญทางประวัติศาสตร์ซึ่งเป็นวิธีการที่จะได้รับสถานที่ในแผนภาพข้างต้น rcเป็นเชลล์มาตรฐานของPlan 9 จากระบบปฏิบัติการBell Labsซึ่งเป็นรุ่นต่อจากรุ่นที่ 10 ของ Unixซึ่งสร้างขึ้นเพื่อเป็นส่วนหนึ่งของการวิจัยอย่างต่อเนื่องของ Bell Labs ในการออกแบบระบบปฏิบัติการ มันเข้ากันไม่ได้กับทั้ง Bourne และ C เชลล์ในระดับการตั้งโปรแกรม อาจมีบทเรียนอยู่ในนั้น

    ตัวแปรที่ใช้งานมากที่สุดของrcดูเหมือนจะเป็นหนึ่งในการบำรุงรักษาโดย Toby Goodwinซึ่งเป็นไปตามrcโคลนUnix โดย Byron Rakitzis


หากคุณต้องการทราบความสัมพันธ์ที่มากขึ้นเช่นด้วยคำสั่ง UNOS "คำสั่ง" "bsh" และ Bourne Shell ล่าสุดให้ส่งข้อความถึงฉัน ตามคำใบ้: คำสั่ง UNOS มีคำสั่ง builtin "do" ซึ่งทำหน้าที่เป็นเชลล์สคริปต์หนึ่งบรรทัดที่มีอาร์กิวเมนต์ แนวคิดนี้ถูกโอนเข้าสู่ Bourne Shell ในรูปแบบ "dosh" และอนุญาตให้ใช้นามแฝงแบบกำหนดพารามิเตอร์ได้สิ่งที่คุณไม่สามารถได้รับจาก ksh หรือ bash
schily

อาจน่าสังเกตว่า pdksh นั้นขึ้นอยู่กับเชลล์ Forsyth ส่วนใหญ่ที่ถูกลืมในวันนี้ แต่มีความสำคัญทางประวัติศาสตร์บางอย่างในมรดก pdksh แต่ก็เป็นเพราะมันเป็นเปลือกของ minix บางรุ่นและได้รับการพอร์ตไปยัง msdos
Stéphane Chazelas

25

"sh Compatible" หมายถึงPOSIXshเชลล์พื้นฐานที่จำเป็นต้องมีอยู่ในระบบที่เข้ากันได้ทั้งหมด สคริปต์ที่เข้ากันได้กับ sh ควรทำงานกับเครื่องที่รองรับ POSIX

เหตุผลก็จำเป็นต้องพูดอย่างนี้ก็คือว่าโดยทั่วไป/bin/shเป็น symlink ไป/bin/bashซึ่งได้ให้ Bashisms บางลื่นในสคริปต์ที่ประกาศตัวเองที่จะใช้กับsh #!/bin/shสคริปต์เหล่านี้ล้มเหลวในการทำงานในระบบที่ไม่ได้ใช้bashเป็น/bin/shรวมทั้ง Unices เชิงพาณิชย์ตลอดไปและDebianและสัญญาซื้อขายล่วงหน้าเมื่อเร็ว ๆ นี้

โดยเฉพาะอย่างยิ่งมีแนวโน้มที่จะใช้dashเชลล์ Debian Almquish เป็นค่าเริ่มต้นshเมื่อเร็ว ๆ นี้เพราะมันมีขนาดเล็กลงและมีความหมายว่าจะเร็วขึ้น แนวโน้มดังกล่าวได้เน้นให้เห็นถึงความผิดพลาดของ Bashisms ที่มีอยู่ในshสคริปต์ การอธิบายบางสิ่งในฐานะ "sh Compatible" บ่งชี้ว่ามันตั้งใจอย่างชัดเจนที่จะทำงานกับระบบเหล่านี้โดยอยู่ในภาษาที่ระบุด้วย POSIX - เชลล์ทั้งหมดจะใช้ superset ของฟังก์ชั่นนั้นดังนั้นจึงรับประกันได้ว่าจะทำงานได้ทุกที่ เข้ากันได้กับคนอื่น

เชลล์ที่แตกต่างกันมีประวัติการพัฒนาของตนเองและมีการเบี่ยงเบนไปในทิศทางต่าง ๆ เมื่อเวลาผ่านไปเนื่องจากพวกมันเพิ่มฟังก์ชั่นเพื่อช่วยในการใช้งานแบบโต้ตอบสำหรับผู้ใช้หรือส่วนขยายสคริปต์เช่นอาเรย์เชื่อมโยง สคริปต์ "sh-เข้ากันไม่ได้" จะใช้คุณลักษณะส่วนขยายที่ไม่ได้มาตรฐานเหล่านี้บางอย่างเช่น[[เงื่อนไขของ Bash

คุณลักษณะที่ไม่ใช่ POSIX ในbashและtcshและzshและเชลล์อื่น ๆทั้งหมดนั้นมีประโยชน์และมีหลายครั้งที่คุณอาจต้องการหรือต้องการ สิ่งเหล่านี้ไม่ควรใช้ในสคริปต์ที่ประกาศตัวเองว่าทำงานได้/bin/shเพราะคุณไม่สามารถใช้คุณสมบัติเหล่านั้นในการshติดตั้งพื้นฐานบนระบบที่คุณใช้งานอยู่

สคริปต์ที่จำเป็นต้องใช้พูดอาร์เรย์ที่เชื่อมโยงควรตรวจสอบให้แน่ใจว่าสคริปต์นั้นทำงานด้วยbashมากกว่าsh:

#!/bin/bash
declare -A array

bashที่จะทำงานได้ทุกที่ด้วย สคริปต์ที่ไม่ต้องการฟังก์ชันการทำงานเพิ่มเติมและตั้งใจให้พกพาได้ควรประกาศว่าพวกเขาใช้shและยึดติดกับภาษาคำสั่งเชลล์พื้นฐาน

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