ทำไมไม่มีใครใช้เชลล์เป้าหมายที่แท้จริงเป็น / bin / sh?


55

ฉันสังเกตเห็นว่าโดยทั่วไปไม่มีระบบใดที่ฉันเคยทำงานด้วย/bin/shเหมือนเป็นการปฏิบัติการจริง มันเสมอ symlink ไปdash, bashในโหมด POSIX หรือสิ่งที่คล้ายกัน

ทำไม? อะไรคือข้อเสียของการใช้ของจริงที่เป็นต้นฉบับ/bin/sh? (ความเร็วใบอนุญาต?)


3
คุณเคยใช้ Linux ใช่ไหม? ฉันเคยเห็น "sh as symlink" บน Linux เท่านั้น
Greg Hewgill

@GregHewgill Solaris รุ่นล่าสุดไม่ได้เชื่อมโยงshกับkshหรือ
Gilles 'หยุดความชั่วร้าย'

1
@Gilles ตามหนึ่งในคำตอบที่ใช่ตั้งแต่ Solaris 11 kshมันเชื่อมโยงกับ
strugee

1
@ GregHewgill ฉันยังใช้ดาร์วินซึ่งมันเชื่อมโยงกับbashIIRC
strugee

6
ต้นฉบับ / bin / shหมายถึงอะไร เปลือก Thomson จาก Unix V1? เชลล์เป้าหมายจาก Unix V7 ที่ไม่มีฟังก์ชั่นไม่ได้แสดงความคิดเห็น ... ? หนึ่งใน SysIII, SysV, Solaris, HP / UX, การใช้เถ้าใน BSDs หรือไม่? ทุกวันนี้shมีพื้นฐานมาจากมาตรฐานซึ่งหมายความว่าเราสามารถมีการใช้งานหลายอย่างที่จะทำงานในแบบที่ระบุได้อย่างชัดเจนตราบใดที่คุณใช้ไวยากรณ์มาตรฐานในสคริปต์ของคุณ
Stéphane Chazelas

คำตอบ:


38

ฉันเดาว่าไม่มีคุณสมบัติ - ไม่มีประวัติคำสั่งไม่มีการเปลี่ยนทิศทางแฟนซีไม่มีการแก้ไขบรรทัดคำสั่ง BSD แนะนำcshC เชลล์ด้วยเหตุผลเหล่านั้น ปัจจัยอีกประการหนึ่งก็คือว่าแท้บอร์นเชลล์เป็นเพียงเมื่อเร็ว ๆ นี้อยู่ในรูปแบบโอเพนซอร์ส คุณจะไม่สามารถแจกจ่ายได้เว้นแต่ว่าคุณจะให้สัญญาอนุญาตนั้น นั่นทำให้พ้นความยุ่งยากสำหรับ distros ที่ไม่มีค่าใช้จ่ายและทำให้มันไม่เหมาะกับผู้อื่นสำหรับ distros อื่น ๆ และ * BSDs

แต่ตอนนี้มีรหัสให้ใช้แล้ว คุณสามารถดูรวบรวมมันให้หมุน


50
จากนั้นสลับกลับไปที่สิ่งที่คุณเคยใช้ก่อนหน้านี้ทันที
Ignacio Vazquez-Abrams

24
@strugee "" ไม่มีคุณสมบัติ "- ทำไมจึงเป็นปัญหา?" ใช่จุดดี ... ทำไมโปรแกรมเมอร์ใช้สิ่งที่ไร้ประโยชน์เช่นแอสเซมบลี / C / ภาษาระดับสูงเมื่อคุณสามารถทำอะไรกับสิ่งที่คุณสามารถเขียนได้แล้ว ภาษาเครื่องโดยตรง ความจริงคือ: คุณสมบัติ = เพิ่มความเร็วในการพัฒนา + เพิ่มความสามารถในการบำรุงรักษา = ลดค่าใช้จ่าย = ดีกว่าการใช้shเหมือนกับการใช้bashยกเว้นว่า: ช้ากว่าโปรแกรมมีความยาวและยากต่อการบำรุงรักษา
Bakuriu

10
มันไม่ได้ขาดคุณสมบัติ แต่ความจริงแล้ว POSIX shสั่งให้เรียกใช้เชลล์ที่ทำงานร่วมกับ POSIX ได้ซึ่งเชลล์ Bourne ดั้งเดิมนั้นไม่ใช่ แม้ว่า POSIX ไม่จำเป็นต้องshอยู่ใน/bin/shนั่นเป็นไดเรกทอรีที่มีเหตุผลมากที่สุดสำหรับมัน
jlliagre

4
ประวัติคำสั่ง @Bakuriu และการแก้ไขบรรทัดคำสั่งเป็นทั้งสองอย่างที่คุณไม่ต้องการสำหรับสคริปต์จริงๆ
strugee

4
@strugee นั่นไม่ใช่ความแตกต่างเท่านั้น ยกตัวอย่างเช่นshไม่ได้มีตัวหนอนและการขยายตัวรั้งบางตัว -ins จะหายไป (เช่นpushdและpopd, select) ไม่มีการขยายตัวทางคณิตศาสตร์ PIPESTATUSจำนวนมากของตัวแปรที่จะหายไปเช่น
Bakuriu

23

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

ส่วนใหญ่ถ้าไม่ใช่ Unix และ Unix ที่เหลือทั้งหมดเช่นรีลีสรวมถึง Solaris 11 จะจัดเตรียมเชลล์ที่เข้ากันได้กับ/bin/shPOSIX เนื่องจาก POSIX บังคับให้shคำสั่งเปิดใช้เชลล์ POSIX ไม่ใช่เชลล์ Bourne ดั้งเดิมซึ่งไม่เข้ากัน /bin/shโดยทั่วไป:

  • ksh88หรือksh93ในการใช้งาน Unix เชิงพาณิชย์
  • แก้ไขbashบนOS/X(แม้ว่าจะเคยเป็นzsh)
  • ashหรือpdkshอนุพันธ์ในอื่น ๆBSDs
  • bashหรือdashในการแจกแจง Gnu / Linux

ไม่จำเป็นต้องมีลิงก์ แต่สามารถใช้งานได้จริงในหลาย ๆ ระบบ แต่เป็น Gnu / Linux

ที่น่าสนใจแม้ว่าสิ่งที่ระบุคำตอบ upvoted ที่สุดสำหรับคำถามของคุณก็ไม่ได้ขาดคุณสมบัติที่ทำให้นักพัฒนาการกระจายการติดตั้งสิ่งที่แตกต่างจากเชลล์ Bourne ดั้งเดิมใน/bin/shแต่ความปรารถนาที่จะเป็นไปตาม POSIX ที่สุดเท่าที่จะทำได้ Unix เช่น OS ความจริงแล้ว POSIX เชลล์มีคุณสมบัติมากกว่าเชลล์ Bourne ดั้งเดิมเป็นเพียงผลข้างเคียงของเป้าหมายการปฏิบัติตามมาตรฐานนี้

มันเป็นความจริงด้วยเช่นbashกันที่หอยบางตัวนั้นมีพฤติกรรมที่แตกต่างกันเมื่อถูกเรียกshและสิ่งนี้ส่วนใหญ่จะเป็นการเอาคุณสมบัติออกจากเปลือกไม่ใช่วิธีอื่น ๆ


16

เท่าที่ฉันรู้ว่าเชลล์เป้าหมายเดิมไม่สามารถใช้ BSDs และโครงการ GNU ได้เนื่องจากสิทธิ์ใช้งาน

ย้อนกลับไปเมื่อ Unix ดั้งเดิมไม่มีใบอนุญาตและโครงการ GNU ต้องการเชลล์ที่อยู่ภายใต้ GPL ดังนั้นพวกเขาจึงใช้ bash

สิ่งเดียวกันนี้เป็นจริงสำหรับ BSD4 ซึ่งเป็นผู้ปกครองของ BSD ทั้งหมด ต้องขอบคุณการฟ้องร้องของ AT&T ที่พวกเขาจำเป็นต้องเขียนแหล่งข้อมูลทั้งหมดจาก Unix ดั้งเดิมรวมถึง Bourne shell

ในบรรทัด BSD ดั้งเดิมเชลล์ Bourne ถูกส่งไปจนถึง 4.3BSD-Reno (แต่ไม่ได้มี Net / 2 และ 4.4BSD ต่อไปนี้อีกต่อไป) สำหรับเหตุผลด้านลิขสิทธิ์มันจึงถูกแทนที่ด้วย bourne-compatible shvr4-sh โดย Kenneth Almquist (มักเรียกว่า ash)

จาก FreeBSD man sh

คำสั่ง sh, เชลล์ Thompson ปรากฏใน Version 1 AT&T UNIX มันถูกแทนที่ในเวอร์ชัน 7 AT&T UNIX โดยเชลล์เป้าหมายซึ่งสืบทอดชื่อ sh

รุ่นของ sh นี้ถูกเขียนใหม่ในปี 1989 ภายใต้ลิขสิทธิ์ BSD หลังจากเชลล์เป้าหมายจาก AT&T System V รีลีส 4 UNIX

ดังนั้นทั้งสองโครงการจึงถูกบังคับให้ไม่ใช้เชลล์เป้าหมายและชำระให้กับเชลล์โอเพ่นซอร์สจริง


7

มีปัญหาอื่น ๆ Bourne Shell ใช้ sbrk () แทน malloc () และสิ่งนี้ทำให้ไม่สามารถพกพาได้

หลังจาก Bourne Shell ได้กลายเป็น OpenSource ผ่าน OpenSolaris ฉันได้สร้าง hafway portable version และต่อมาเป็น portable portable จริงๆโดยแทนที่ sbrk () โดย malloc () ด้วยความช่วยเหลือจาก Geoff Collyer (บุคคลเดียวกันที่ช่วยหลีกเลี่ยง sbrk () ใน กรณ์เชลล์)

เหตุผลแรกที่ฉันทำ Bourne Shell รุ่นพกพาก็คือฉันชอบที่จะสร้างตัวแก้ไขประวัติที่ฉันเขียนสำหรับ "bsh" ของฉันระหว่างปี 1982 และ 1984 ที่มีอยู่ใน Bourne Shell เช่นกัน ในขณะเดียวกันฉันก็บอกถึงลักษณะเฉพาะที่ฉันเขียนเพื่อ "bsh" ไปยัง Bourne Shell

นี่คือกลุ่มอื่น ๆ :

  • รวบรวมและใช้งานได้เกือบทุกที่รวมถึง Cygwin (เร็วกว่าการทุบตีเกือบ 2 เท่า)
  • ตัวแก้ไขประวัติที่มีบัฟเฟอร์วงแหวน LRU
  • builtin TERMCAP
  • นามแฝงขั้นสูง (นามแฝงถาวรทั่วโลกนามแฝงในท้องถิ่น, .... ) และร่วมกับ builtin "dosh" Bourne Shell เป็นการนำ Bourne Shell เพียงตัวเดียวที่อนุญาตให้ใช้นามแฝงแบบกำหนดพารามิเตอร์ได้
  • สนับสนุนการแก้ไขนามแฝงที่ซับซ้อนในตัวแก้ไขประวัติในโหมด raw
  • เข้าถึงรหัส exit (2) 32 บิตผ่านตัวแปร. sh. *
  • การจับเวลาอัตโนมัติขั้นสูงด้วยความละเอียด 6 หลัก
  • pushd / popd / dirs
  • builtin "ค้นหา"
  • ท่อจาก stderr
  • ใช้ vfork () เพื่อประสิทธิภาพที่ดีขึ้น
  • ในที่สุดแก้ไขข้อผิดพลาดที่บันทึกไว้ทั้งหมดจาก SVr4 Bourne Shell เช่น suspend จะทำงานในโหมดควบคุมงานเสมอ ...

หน้าคนออนไลน์อยู่ที่: http://schillix.sourceforge.net/man/man1/bosh.1.html แหล่งที่มาเป็นส่วนหนึ่งของกล่องเครื่องมือ schily ที่:

https://sourceforge.net/projects/schilytools/files/

ฉันแนะนำให้ใช้: http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 หรือรุ่นที่ใหม่กว่า

ป.ล. ฉันสนใจในข้อเสนอแนะ


สวัสดี Joerg ทำไมพอร์ตเหล่านั้นไปยังเชลล์เป้าหมายแทนที่จะเป็นเชลล์ที่ได้รับ POSIXified เหมือน BSD sh หรือ pdksh บางตัว?
Stéphane Chazelas

การย้าย Bourne Shell เป็นสิ่งที่ท้าทายเนื่องจากไม่ได้ใช้ stdio นี่เป็นความท้าทายที่คล้ายกันกับการใช้แหล่ง csh ดั้งเดิมและทำให้คอมไพล์โดยแทนที่ non-stdio printf ที่เขียนในแอสเซมเบลอร์ VAX แต่ฉันได้เพิ่มฟีเจอร์ POSIX ที่ใหม่กว่าลงใน Bourne Shell และฉันชอบที่จะอยู่กับ Bourne Shell บน SchilliX เพื่อให้มันสามารถบูทด้วย / anr / usr บนระบบไฟล์แยกกันซึ่งเป็นไปไม่ได้ที่ Korn Shell
schily

โปรดทราบว่าฉันต้องการตรวจสอบว่าความเร็วของ ksh เกิดจากการใช้ vfork () ตอนนี้ฉันแปลง Bourne Shell เป็น vfork () เร็วพอ ๆ กับ ksh รุ่นล่าสุด นี่เป็นประสบการณ์ที่คุณจะได้รับเมื่อเริ่มต้นด้วยรหัสต้นฉบับของ Bourne Shell
schily

ตกลง แต่จนกว่าคุณจะทำตามมาตรฐาน POSIX sh นั้นก็ไม่น่าจะดึงดูดความสนใจมาก ฉันจำได้ว่าคุณถามกลุ่ม ML austin เกี่ยวกับความไม่ลงรอยกันกับ POSIX ของ Bourne shell มันเป็นสิ่งที่คุณกำลังทำงานหรือไม่ (ซึ่งหมายถึงความเข้ากันได้แบบย้อนหลังกับ Bourne shell) ผู้คน (ฉันอย่างน้อย) พิจารณา POSIX sh ไวยากรณ์ความคืบหน้าผ่านเชลล์เป้าหมาย การโทรหาเชลล์เป้าหมายที่ได้มาจากบอร์นนั้นคือเชลล์เชลล์อาจส่งการแสดงผลที่ไม่ถูกต้อง วิธีการเกี่ยวกับ bimsh (ปรับปรุง Bourne (ala vi / vim))?
Stéphane Chazelas

Bourne Shell ของฉันดีกว่า ksh ในบางแง่มุมเช่นการใช้นามแฝงที่ดีกว่า pushd / popd / dirs และการสนับสนุนการใช้ประโยชน์ทรัพยากรโดยใช้คุณสมบัติ UNIX ที่ทันสมัยแทนหาก ksh ทำอะไรซึ่งยังใช้ SVr2 อยู่ ในขณะที่คุณดูเหมือนจะสนใจและมีทักษะในเชลล์ฉันต้องการได้รับแนวคิดเกี่ยวกับสิ่งที่คุณต้องการจะดูต่อไปใน Bourne Shell หลังจากอ่าน: schillix.sourceforge.net/man/man1/bosh.1.htmlโปรดทราบว่า จนถึงตอนนี้ฉันมีรหัสใหม่ทั้งหมด # ifdef และคุณสมบัติบางอย่าง (เช่นท่อ stderr) จะต้องเปิดใช้งานผ่านชุด (1)
schily

4

จะเชื่อมโยงกับเปลือกหอยที่ให้ 100% เข้ากันได้ย้อนหลัง คุณจะไม่สูญเสียสิ่งใด ๆ ที่เปลือกดั้งเดิมมี แต่ได้รับคุณสมบัติเพิ่มเติมจากด้านบน ไม่มีข้อเสียดังนั้นทำไมจึงพลาดคุณสมบัติใหม่ ๆ นี่คือเหตุผลที่ว่าทำไมเหมือนกัน/bin/viมักจะมีการเชื่อมโยงกับกลุ่ม


5
ข้อเสียคือคนเขียนสคริปต์ที่ทำงานบนระบบเดียวของพวกเขาคิดว่าสคริปต์ของพวกเขาเข้ากันได้เมื่อมันไม่ได้ ฉันเคยแก้ไขสคริปต์เชลล์ Gentoo เกือบร้อยตัวที่ต้องการทุบตี แต่เรียกว่า / bin / sh พวกเขาทั้งหมดแตกเมื่อฉันเปลี่ยน / bin / sh เป็นเส้นประแทนที่จะทุบตี
Zan Lynx

3
"ไม่มีข้อเสีย" - ความเร็ว เช่นbashมากช้ากว่าdash
strugee

@strugee หากคุณกำลังมองหาการปรับปรุงช่วงความเร็ว ms ในเชลล์คุณอาจไม่ได้ใช้เครื่องมือที่เหมาะสมสำหรับงาน
Chris Down

1
@ChrisDown กำหนด "การปรับปรุงช่วง ms" หรือไม่
strugee

2
ไวยากรณ์ POSIX sh ไม่สามารถทำงานร่วมกับไวยากรณ์ Bourne sh ได้แบบย้อนหลังอย่างสมบูรณ์ ตัวอย่างเช่นIFS=,; rm file1,file2,file3จะลบ 3 ไฟล์เหล่านั้นในเชลล์เป้าหมาย คุณลักษณะ (silly) นั้นถูกลบใน POSIX sh มีความแตกต่างเล็กน้อยหลายประการที่อาจทำให้สคริปต์เขียนสำหรับเชลล์เป้าหมายทำงานแตกต่างกันด้วย POSIX sh
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.