การเชื่อมโยงไปยังจุดประคืออะไร?


35

ฉันสงสัยว่าสิ่งที่shเป็นสัญลักษณ์เชื่อมโยงdashคืออะไร? ผมเข้าใจว่าdashควรจะเร็วกว่าbashแต่ผมไม่แน่ใจว่าทำไมเดิมเปลือกไม่ได้อยู่ในปัจจุบันshsh

หรือถ้ามีอะไรทำไมไม่ได้shเชื่อมโยงกับbash?

คำตอบ:


70

คำตอบสั้น ๆ “ ทำไมเปลือก sh ดั้งเดิมไม่ปรากฏในsh” คือไม่มี sh เดิม

ดี ok มี: มันเป็นอมป์สันเปลือก เวอร์ชัน 1 มีคุณสมบัติบางอย่างที่เรารู้วันนี้โดยเฉพาะอย่างยิ่งการเปลี่ยนเส้นทางและท่อ (อ่านกระดาษของ Dennis Ritchie เกี่ยวกับประวัติ Unix ในช่วงต้น ) รุ่นที่ใหม่กว่าเพิ่มคุณสมบัติเช่นการเรียกใช้พื้นหลังด้วย&, การทำให้กลม (นำไปใช้กับโปรแกรมภายนอก), และบางรูปแบบของการอ้างถึง แต่มันไม่มีตัวแปรหรือโครงสร้างการควบคุมที่ซ้อนกัน เงื่อนไขและลูปถูกจัดเตรียมผ่านโปรแกรมภายนอกif(ซึ่งใช้เงื่อนไขหนึ่งข้อและหนึ่งคำสั่งเป็นอาร์กิวเมนต์) และgoto(ซึ่งทำงานโดยการเปลี่ยนตำแหน่งไฟล์ของพาเรนต์ในไฟล์สคริปต์)

ในปี 1979 ในUnix V7 , ธ อมป์สันเปลือกถูกแทนที่/bin/shโดยบอร์นเชลล์ รุ่นแรกแล้วมีหลายคุณสมบัติที่มีอยู่ในเส้นประในวันนี้และรุ่นต่อ ๆ มาแนะนำอื่น ๆ อีกมากมาย ไม่กี่ปีต่อมากระสุน Kornมาถึงฉากพร้อมชุดคุณลักษณะที่เพิ่มขึ้น สายพันธุ์ Unix kshหลายติดตั้งไว้ภายใต้ชื่อ

ในปี 1992 POSIXประมวลผลชุดshคุณลักษณะขั้นต่ำที่เป็นพื้นฐานบอร์นบวกบางอย่าง ระบบใด ๆ ที่เรียกตัวเองว่า "Unix" นั้นต้องใช้คุณสมบัติเหล่านี้อย่างน้อยที่สุด ระบบ Unix เชิงพาณิชย์มักจะใช้ ksh เป็น POSIX sh แต่เพียงไม่กี่ (เช่นOSF / 1 ) มีของตัวเอง

เชลล์ Bourne หรือ Korn shell ไม่ได้เป็นโอเพ่นซอร์สจนกระทั่งเมื่อไม่นานมานี้ดังนั้นเมื่อโลกของ Linux เริ่มก่อตัวขึ้นในกลางปี ​​1990 พวกเขาก็ไม่สามารถใช้งานได้ /bin/shต้องเป็นอย่างอื่น ลีนุกซ์ส่วนใหญ่ใช้สำหรับbash , เชลล์จากโปรเจ็กต์ GNUที่มักจะอยู่ระหว่าง Bourne และ Korn ในแง่ของคุณสมบัติการเขียนสคริปต์, และดีกว่าการใช้แบบอินเตอร์แอคทีฟ) ทางเลือกเดียวที่ทำงานได้คือ pdksh (“ โดเมนสาธารณะ Korn shell”), ฟรี (หยุดตอนนี้, แต่อาศัยอยู่ในฐานะmksh , ซึ่งได้รับการพัฒนาอย่างแข็งขัน ) แต่ฉันจำการแจกจ่าย Linux โดยใช้ pdksh ไม่ได้/bin/shฉันไม่รู้ว่าทำไมฉันเดาเพราะการแจกแจงลินุกซ์เป็น GNU / ลีนุกซ์เสมอการแจกจ่ายเครื่องมือใด ๆ ที่เป็นเวอร์ชั่น GNU อยู่

นอกจากนี้ยังมีการใช้งานโอเพ่นซอร์สหลายอย่างที่shเรียกว่า“ ขี้เถ้า” โดยเฉพาะอย่างยิ่งเปลือก Almquistแต่ก็ไม่สมบูรณ์มากขาดคุณสมบัติ POSIX บางอย่างที่ผู้คนต้องการใช้ โปรแกรมเมอร์ที่เป็นผู้ดูแลเดเบียนเฮอร์เบิร์ตซูได้ขยายเถ้าเพื่อให้เป็นไปตาม POSIX ในที่สุดเวอร์ชันของเขาถูกเปลี่ยนชื่อเป็นเส้นประและมีการผลักดันให้ทำ/bin/shใน Debian แทนที่จะทุบตี อูบุนตูเริ่มออกก่อนที่จะเริ่มต้นในการ Debian bashisms รักษาระบบ (การใช้ฟังก์ชั่นทุบตีเฉพาะใน#!/bin/shสคริปต์) เป็นข้อบกพร่อง ทั้งคู่เปลี่ยนในภายหลัง ( Ubuntu 6.10 , Debian เฉพาะในปี 2009 ( มันเป็นเป้าหมายสำหรับเงิน) แต่สวิตช์ถูกสร้างขึ้นหลังจากปล่อยเลนนี่คือบีบ))

พันตรีเหตุผลสำหรับการใช้เส้นประเป็นมากกว่าทุบตีเป็น/bin/shก็คือว่ามันเร็วขึ้นอย่างมีนัยสำคัญ นี่เป็นสิ่งสำคัญอย่างยิ่งสำหรับ Ubuntu ซึ่งพยายามรักษาเวลาบูตให้สั้นตั้งแต่เริ่มต้น Dash ยังมีแนวโน้มที่จะใช้หน่วยความจำน้อยกว่าทุบตีซึ่งค่อนข้างสำคัญสำหรับสคริปต์ตัวหุ้มที่อยู่รอบ ๆ เพื่อทำการล้างข้อมูลเล็กน้อยเมื่อโปรแกรมพื้นฐานออก ข้อดีอีกอย่างของ dash คือมันใช้เพียง libc (ไลบรารีระบบหลัก) ในขณะที่ bash ยังต้องอาศัยไลบรารีสนับสนุนเทอร์มินัล (มันไม่สามารถเริ่มได้หากไม่มีพวกมันแม้แต่เรียกใช้สคริปต์) นี่หมายความว่าเส้นประมีโอกาสที่ดีกว่าในการทำงานกับระบบที่เสียหาย

เมื่อถึงจุดหนึ่งในช่วงศตวรรษที่ 21 เปลือกหอย Korn ก็เปิดโอเพ่นซอร์สและรุ่นโอเพ่นซอร์สของบอร์นเชลล์ก็ปรากฏขึ้น (เวอร์ชั่นเก่าเนื่องจากการพัฒนาหยุดลงเมื่อหลายปีก่อน) แต่ชนและทุบตีถูกยึดติดแน่นเกินไปในโลกลินุกซ์สำหรับพวกเขาที่จะได้รับการยอมรับโดยเฉพาะอย่างยิ่งบอร์นเชลล์เนื่องจากมูลค่าในวันนี้เป็นเพียงประวัติศาสตร์ รีบย้ายทุบตีเพราะมันมีผลประโยชน์ที่ชัดเจน แต่ไม่มีผู้ใดใน contenders อื่น ๆ ที่มีประโยชน์ใด ๆ /bin/shที่เป็นเด็ดขาด


ฉันยืนยันว่ามีเหตุผลที่ดีที่จะใช้ ksh93 เป็น / bin / sh - เป็นหนึ่งในเชลล์ POSIX ประสิทธิภาพสูงที่สุดที่มีอยู่ เห็นด้วยว่าความแพร่หลายของเส้นประเป็นเรื่องของการกำหนดเวลา
Charles Duffy

2
@CharlesDuffy Ksh93 เร็วขึ้นในการทำสิ่งที่ซับซ้อน แต่รีบเต้นเพื่อเวลาเริ่มต้นและสำหรับสคริปต์ง่าย ๆ (เช่นการเรียกทั้งหมดsystem(3) ที่แอปพลิเคชันสร้าง) นั่นเป็นปัจจัยสำคัญ
Gilles 'ดังนั้นหยุดความชั่วร้าย'

21

ความเร็วและการปฏิบัติตาม POSIX (หรืออีกนัยหนึ่งคือความสะดวกในการพกพา) เป็นปัจจัยหลัก จำไว้ว่า/bin/shมีไว้สำหรับสคริปต์ของระบบซึ่งอาจมาจาก Ubuntu และ / หรือระบบอื่น ๆ รุ่นเก่ากว่า

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

สำหรับเหตุผลที่บอร์นเชลล์ดั้งเดิมไม่ปรากฏขึ้นมันเป็นเรื่องง่าย - เป็นผลิตภัณฑ์ที่มีกรรมสิทธิ์โดย AT&T Bell Labs

นอกจากนี้ยังมีคำอธิบายที่ชัดเจนเกี่ยวกับอูบุนตูว่า:

ทำไมการเปลี่ยนแปลงนี้จึงเกิดขึ้น เหตุผลหลักในการเปลี่ยนเชลล์เริ่มต้นคือประสิทธิภาพ bash เป็นกระสุนเต็มรูปแบบที่ยอดเยี่ยมเหมาะสำหรับการใช้แบบโต้ตอบ; แท้จริงมันยังคงเป็นเปลือกเข้าสู่ระบบเริ่มต้น อย่างไรก็ตามมันค่อนข้างใหญ่และช้าในการเริ่มต้นและใช้งานโดยเปรียบเทียบกับเส้นประ เชลล์อินสแตนซ์จำนวนมากเริ่มขึ้นซึ่งเป็นส่วนหนึ่งของกระบวนการบูตของ Ubuntu แทนที่จะเปลี่ยนแต่ละตัวเป็นรายบุคคลเพื่อให้ทำงานอย่างชัดเจนภายใต้ / bin / dash การเปลี่ยนแปลงที่จะต้องมีการบำรุงรักษาอย่างต่อเนื่องที่สำคัญและจะต้องรับผิดชอบหากไม่ได้รับความสนใจอย่างใกล้ชิดทีมพัฒนาหลักของ Ubuntu รู้สึกว่าเป็นการง่ายที่สุดในการเปลี่ยนแปลง เปลือกเริ่มต้น การปรับปรุงความเร็วในการบู๊ตใน Ubuntu 6.10 มักเกิดจาก Upstart ซึ่งเป็นแพลตฟอร์มที่ดีสำหรับการพัฒนาระบบเริ่มต้นในอนาคต แต่ใน Ubuntu 6 10 ส่วนใหญ่ทำงานในโหมดความเข้ากันได้ของ System V โดยมีการเปลี่ยนแปลงพฤติกรรมเล็กน้อยเท่านั้น การปรับปรุงเหล่านี้ส่วนใหญ่เกิดจากการเปลี่ยนแปลง / bin / sh

และนี่คือข้อความเกี่ยวกับการพกพา:

คู่มือนโยบาย Debian ได้รับคำสั่งมานานแล้วว่า "เชลล์สคริปต์ระบุ '/ bin / sh' ในฐานะล่ามจะต้องใช้ฟีเจอร์ POSIX เท่านั้น"; ในความเป็นจริงข้อกำหนดนี้มีมาตั้งแต่ก่อนเริ่มโครงการ Ubuntu นอกจากนี้เชลล์สคริปต์ใด ๆ ที่คาดว่าจะพกพาไปยังระบบ Unix อื่น ๆ เช่น BSDs หรือ Solaris ได้รับการยอมรับตามข้อกำหนดนี้แล้ว ดังนั้นเรารู้สึกว่าผลกระทบที่เข้ากันได้ของการเปลี่ยนแปลงนี้จะน้อยที่สุด

ดูhttps://wiki.ubuntu.com/DashAsBinSh


ไม่dashรองรับคุณสมบัติที่ไม่ต้องการPOSIXหรือ
NerdOfLinux

@NerdOfLinux ไม่สำคัญว่า / bin / sh รองรับนอกเหนือจาก POSIX (ตราบใดที่ส่วนเพิ่มเติมเหล่านั้นไม่ทำลายสคริปต์ POSIX) สิ่งสำคัญคือมันรองรับ POSIX ทุกอย่าง (และเร็วที่สุด) ตราบใดที่เส้นประตอบสนองความต้องการเหล่านี้แล้ว / bin / sh ก็สามารถเชื่อมโยงไปได้
Guntram Blohm สนับสนุนโมนิกา

9

ในการแจกแจง GNU / Linux คำว่า "ดั้งเดิม/bin/sh" คือ Bash

GNU ต้องการเปลือกที่คล้ายบอร์นที่อยู่ภายใต้ GPL ดังนั้นจึงเป็นเหตุผลว่าทำไมพวกเขาจึงเลือก Bash /bin/shแทนบอร์นซึ่งไม่ได้รับลิขสิทธิ์ GPL Linux distros สมัยใหม่สืบทอดการตัดสินใจนี้จนถึงจุดที่มันกลายเป็นมาตรฐาน defacto สำหรับ/bin/shการเป็น Bash Bourne shell ดั้งเดิม ("sh") ถูกใช้ในระบบปฏิบัติการอื่น ๆ ที่ไม่ใช่ Linux Unixes แม้กระทั่งเมื่อเร็ว ๆ นี้เป็น Solaris 10 แต่ก็ไม่เคยเป็นแกนนำในการแจกแจง Linux

การเปลี่ยน/bin/shจาก bash เป็น dash เป็นการตัดสินใจของ Debian (สืบทอดโดย Ubuntu) ซึ่งได้แรงบันดาลใจจากความเร็วเป็นส่วนใหญ่ - มันมาในเวลาที่พวกเขาพยายามอย่างมากในการปรับปรุงความเร็วในการบู๊ตและส่วนใหญ่ของเวลา CPU CPU สคริปต์ init

Bash จะยังคงใช้เป็นเชลล์แบบโต้ตอบ / ล็อกอินเริ่มต้นสำหรับผู้ใช้ แต่ Dash เป็นหนึ่งในนั้น/bin/shและหนึ่งซึ่งจะถูกดำเนินการสำหรับสคริปต์ระบบเช่นสคริปต์ init

Dash นั้นเร็วมาก แต่ก็เข้ากันได้กับ POSIX ได้มาก - มาตรฐานที่จัดชิดอย่างใกล้ชิดกับ Bourne shell ดังนั้นโดยการเปลี่ยนจาก Bash เป็น Dash เราจะย้ายกลับไปที่กระสุนที่ใกล้ชิดกับ Bourne มากขึ้น


"รีบเป็นไปอย่างรวดเร็วมาก แต่ก็ยังเป็นอย่างใกล้ชิด POSIX ได้. - มาตรฐานที่สอดคล้องอย่างใกล้ชิดกับบอร์นเชลล์" ใช่แม้ว่า POSIX เป็นที่เกี่ยวข้องกับการใกล้ชิดมากขึ้นkshผมว่า ฉันไม่จำ Bourne shell ที่มีการขยายเลขคณิต `$ (())` ซึ่งเป็น POSIX
Sergiy Kolodyazhnyy

1
นอกจากนี้ใน Bourne ^เป็นตัวไพพ์ - ดังนั้นecho foo ^ catจะปล่อยfoo ^ catใน POSIX sh แต่fooใน Bourne; การทดสอบเฉพาะนี้เป็นวิธีที่ Autoconf บอกให้ทั้งสองแยกออกจากกัน
Charles Duffy

น่าสนใจดังนั้น POSIX คุณหมายถึง Korn หรือไม่
thomasrutter

0

/bin/shเชื่อมโยงกับ/bin/dashสิ่งที่ฉันเชื่อว่าเป็นเหตุผลความเข้ากันได้ สคริปต์จำนวนมากเริ่มต้นด้วย

#!/bin/sh

ดังนั้นโดยการย้ายไปdashและไม่สร้างลิงก์สัญลักษณ์สคริปต์จำนวนมากจะไม่สามารถทำงานได้อย่างถูกต้อง (หรือเลย) หาก/bin/shไม่มีอยู่เลย

ซึ่งเป็นการเปลี่ยนแปลงที่ทำจากbashไปdashเพราะตามhttps://wiki.ubuntu.com/DashAsBinSh :

เหตุผลหลักในการเปลี่ยนเชลล์เริ่มต้นคือประสิทธิภาพ bash เป็นกระสุนเต็มรูปแบบที่ยอดเยี่ยมเหมาะสำหรับการใช้แบบโต้ตอบ; แท้จริงมันยังคงเป็นเปลือกเข้าสู่ระบบเริ่มต้น อย่างไรก็ตามมันค่อนข้างใหญ่และช้าในการเริ่มต้นและใช้งานโดยเปรียบเทียบกับเส้นประ เชลล์อินสแตนซ์จำนวนมากเริ่มขึ้นซึ่งเป็นส่วนหนึ่งของกระบวนการบูตของ Ubuntu แทนที่จะเปลี่ยนแต่ละตัวเป็นรายบุคคลเพื่อให้ทำงานอย่างชัดเจนภายใต้ / bin / dash การเปลี่ยนแปลงที่จะต้องมีการบำรุงรักษาอย่างต่อเนื่องที่สำคัญและจะต้องรับผิดชอบหากไม่ได้รับความสนใจอย่างใกล้ชิดทีมพัฒนาหลักของ Ubuntu รู้สึกว่าเป็นการง่ายที่สุดในการเปลี่ยนแปลง เปลือกเริ่มต้น

shไม่ได้เชื่อมโยงกับbashเพราะ

คู่มือนโยบาย Debian ได้รับคำสั่งมานานแล้วว่า "เชลล์สคริปต์ระบุ '/ bin / sh' ในฐานะล่ามจะต้องใช้คุณสมบัติ POSIX เท่านั้น"

หากคุณต้องการใช้bashเป็น/bin/sh:

หากปัญหานั้นแพร่หลายมากขึ้นและคุณต้องการเปลี่ยนเชลล์ระบบเริ่มต้นกลับมาคุณสามารถสั่งให้ระบบการจัดการแพ็กเกจหยุดการติดตั้ง dash เป็น / bin / sh:

sudo dpkg-reconfigure dash

มีคุณสมบัติบางอย่างที่dashให้ bash ที่ไม่เป็น:

แม้จะมีโอกาสภายนอกที่มีสคริปต์บางตัวที่ตอนนี้ขึ้นอยู่กับคุณสมบัติของเส้นประที่ทุบตีไม่ได้ให้!


ฉันเข้าใจความเข้ากันได้อาจจะเป็นปัจจัย AA แต่ผมมองหาไม่ชัดเจนดังนั้นและอื่น ๆ ในคำตอบลึก ...
NerdOfCode

2
ดังนั้นถ้าฉันจะติดตั้งเปลือก bourne ดั้งเดิมshไปที่/bin/shนี่จะทำให้สคริปบู๊ตเหล่านั้นเหรอ?
ของหวาน

อาจจะดีที่สุดที่จะลองสิ่งนี้ในเครื่องเสมือนก่อนที่จะนำไปใช้กับโลกแห่งความจริง ...
NerdOfCode

2
คุณควรปล่อยให้/bin/shเป็นเชลล์ที่ได้รับจากการแจกจ่ายซึ่งเป็นสิ่งที่พวกเขาได้กำหนดเป้าหมายด้วยสคริปต์สำหรับเริ่มระบบและสิ่งที่คล้ายกัน แต่ถ้าคุณแทนที่ด้วย Bourne มันจะเข้ากันได้เป็นส่วนใหญ่ ฉันคิดว่าจะมีการแตก แต่เนื่องจากความแตกต่างนาทีเทียบกับจำนวนรหัสที่แท้จริง แน่นอนว่าคุณสามารถใช้เชลล์ใดก็ได้ในสคริปต์ของคุณเองด้วย hashbang ที่กำหนดเอง
thomasrutter

1
@mckenzm เปลือกใดที่/bin/shลิงก์ไปยังแยกจากที่ผู้ใช้คนใดคนหนึ่งได้ตั้งเป็นเปลือกเข้าสู่ระบบเริ่มต้น เป้าหมายของการ/bin/shไม่ได้ขึ้นอยู่กับผู้ใช้ที่กำลังมองหาและคุณทำจำเป็นต้องใช้sudo--or วิธีการอื่น ๆ บางส่วนของการทำหน้าที่เป็นผู้ใช้ราก - ที่จะเปลี่ยนมัน นอกจากนี้โดยทั่วไปและสำหรับแพ็คเกจใด ๆdpkg-reconfigureจะต้องเรียกใช้เป็นรูท ในทางตรงกันข้ามผู้ใช้มักได้รับอนุญาตให้เปลี่ยนเชลล์ล็อกอินเริ่มต้นของตนเองและสามารถทำได้ด้วยchshคำสั่ง ชื่อของเปลือกเข้าสู่ระบบเริ่มต้นของคนนั้นก็เข้ามา$SHELLและใช้สำหรับเชลล์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบด้วยเช่นกัน
Eliah Kagan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.