ความแตกต่างระหว่าง sh และ bash


1303

เมื่อมีการเขียนโปรแกรมเปลือกเรามักจะใช้และ/bin/sh /bin/bashฉันมักจะใช้bashแต่ฉันไม่รู้ว่าอะไรคือความแตกต่างระหว่างพวกเขา

ความแตกต่างหลักระหว่างbashและshคืออะไร

เราทำอะไรจะต้องตระหนักว่าเมื่อการเขียนโปรแกรมในbashและsh?


21
สำหรับรายการ bashisms ที่เป็นประโยชน์และโค้ดที่เกี่ยวข้องที่ทำงานบน Bourne shell ดูmywiki.wooledge.org/Bashism
StackExchange saddens dancek

1
คุณอาจต้องการดูมาตรฐานPOSIXสำหรับ sh และภาษาคำสั่ง: * sh * ภาษาคำสั่งเชลล์
Maurício C Antunes

7
ตามกฎทั่วไปสคริปต์ sh ทั้งหมดจะทำงานภายใต้การทุบตีเนื่องจากความเข้ากันได้ของ posix แต่สคริปต์การทุบตีทั้งหมดไม่สามารถทำงานภายใต้ sh ความแตกต่างที่สำคัญที่คุณสังเกตเห็นคือสิ่งที่ [[]] แทนที่จะเป็น [] เปรียบเทียบ $ (()) แทนที่จะเป็น $ [] นิพจน์เชิงคณิตศาสตร์และสิ่งอื่น ๆ เช่น "มันใหญ่เกินไปและช้าเกินไป" โดยตรงจาก bash docs .. แต่ scripters ใหม่ไม่จำเป็นต้อง จำกัด ตัวเองเป็นสคริปต์ที่เข้ากันได้กับ sh เว้นแต่พวกเขาจะถ่ายทำบางอย่าง ความเข้ากันได้ย้อนหลังซึ่งบ่อยกว่าไม่ใช่ในทุกวันนี้หลังจากนั้นมันก็คือ (หรือ ... ) ในปี 2014 ใช่มั้ย ??
osirisgothra

คำตอบ:


1140

SH คืออะไร

sh(หรือ Shell Command Language) เป็นภาษาโปรแกรมที่อธิบายโดยมาตรฐาน POSIX แต่ก็มีการใช้งานจำนวนมาก ( ksh88, dash, ... ) bashสามารถพิจารณาการดำเนินการของsh(ดูด้านล่าง)

เนื่องจากshเป็นข้อกำหนดไม่ใช่การนำไปใช้/bin/shเป็น symlink (หรือฮาร์ดลิงก์) เพื่อนำไปใช้งานจริงในระบบ POSIX ส่วนใหญ่

ทุบตีคืออะไร

bashเริ่มต้นเป็น - shใช้งานร่วมกันได้ (แม้ว่าจะลงวันที่ก่อนหน้ามาตรฐาน POSIX โดยไม่กี่ปี) แต่เมื่อเวลาผ่านไปมันได้รับส่วนขยายจำนวนมาก ส่วนขยายเหล่านี้จำนวนมากอาจเปลี่ยนพฤติกรรมของสคริปต์เชลล์ POSIX ที่ถูกต้องดังนั้นโดยตัวมันเองbashจะไม่ใช่เชลล์ POSIX ที่ถูกต้อง แต่มันเป็นภาษาถิ่นของภาษาเชลล์ POSIX

bashรองรับ--posixสวิตช์ซึ่งทำให้เป็นไปตาม POSIX ได้มากขึ้น นอกจากนี้ยังพยายามที่จะเลียนแบบ POSIX shถ้าเรียกว่าเป็น

sh = ทุบตี?

เป็นเวลานานที่/bin/shจะใช้ชี้ไป/bin/bashที่ระบบ GNU / Linux ส่วนใหญ่ เป็นผลให้มันเกือบจะปลอดภัยที่จะเพิกเฉยความแตกต่างระหว่างทั้งสอง แต่นั่นเริ่มเปลี่ยนไปเมื่อเร็ว ๆ นี้

ตัวอย่างที่นิยมของระบบที่/bin/shไม่ได้ชี้ไปที่/bin/bash(และในบางระบบ/bin/bashอาจไม่มีอยู่) คือ:

  1. โมเดิร์น Debian และ Ubuntu ระบบซึ่ง symlink shไปdashโดยค่าเริ่มต้น
  2. Busyboxinitramfsซึ่งดำเนินการปกติในช่วงเวลาการบูตระบบลินุกซ์เป็นส่วนหนึ่งของ มันใช้การใช้ashเปลือก
  3. BSDs และโดยทั่วไประบบที่ไม่ใช่ Linux OpenBSD ใช้pdkshลูกหลานของ Korn เชลล์ FreeBSD's shเป็นผู้สืบทอดของเชลล์ UNIX Bourne ดั้งเดิม Solaris มีของตัวเองshซึ่งเป็นเวลานานไม่เป็นไปตาม POSIX; การดำเนินงานที่สามารถใช้ได้ฟรีจากโครงการ Heirloom

คุณจะทราบได้อย่างไรว่า/bin/shระบบของคุณชี้ไปที่ใด?

ภาวะแทรกซ้อนคือ/bin/shอาจเป็นลิงก์สัญลักษณ์หรือลิงก์ยาก หากเป็นลิงก์สัญลักษณ์วิธีพกพาในการแก้ไขคือ:

% file -h /bin/sh
/bin/sh: symbolic link to bash

หากเป็นการเชื่อมโยงที่ยากลอง

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

ในความเป็นจริงการ-Lตั้งค่าสถานะครอบคลุมทั้ง symlinks และ hardlinks แต่ข้อเสียของวิธีนี้คือมันไม่สามารถพกพาได้ - POSIX ไม่ต้องการ findการสนับสนุน-samefileตัวเลือกแม้ว่าGNU findและFreeBSD จะพบการสนับสนุน

เส้น Shebang

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

เช่น

#!/bin/sh

จะใช้sh(และอะไรก็ตามที่เกิดขึ้นกับจุด)

#!/bin/bash

จะใช้/bin/bashถ้ามันมีอยู่ (และล้มเหลวพร้อมกับข้อความแสดงข้อผิดพลาดหากไม่มี) แน่นอนคุณยังสามารถระบุการนำไปใช้อื่นเช่น

#!/bin/dash

ใช้อันไหนดี

สำหรับสคริปต์ของฉันเองฉันชอบshด้วยเหตุผลดังต่อไปนี้:

  • มันเป็นมาตรฐาน
  • มันง่ายกว่ามากและง่ายต่อการเรียนรู้
  • มันเป็นแบบพกพาในระบบ POSIX - แม้ว่าพวกเขาจะไม่เกิดขึ้นbashพวกเขาจะต้องมีsh

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


หากคุณเรียกใช้สคริปต์ด้วยbashวิธีแสดงข้อความข้อผิดพลาดที่เป็นประโยชน์มากขึ้นในกรณีของข้อผิดพลาดทางไวยากรณ์ คุณสามารถประหยัดเวลาได้ง่ายๆด้วยการใช้ bash
PHPst

อะไร%หมายถึงจุดเริ่มต้นของบรรทัดคำสั่งของคุณ?
JosephHarriott

@JosephHarriott เป็นพรอมต์: อักขระที่พิมพ์โดยเชลล์เองหลังจากนั้นคำสั่งของคุณจะตามมา เชลล์บางตัวใช้$แทน%หรือ#สำหรับรูทเชลล์
Roman Cheplyaka

@ RomanCheplyaka ซึ่งเปลือกหอย? ฉันเคยเห็น$และ#...
JosephHarriott

@ RomanCheplyaka ฉันแน่ใจว่าshมีอยู่ก่อน bash (ซึ่งย่อมาจากเปลือก bourne-again) แต่มันดั้งเดิมมากและไม่ตอบสนองต่อเหตุการณ์เทอร์มินัลเช่นESCตัวละคร จากนั้นkshก็มาถึง (ก่อนที่จะทุบตี) แล้วทุบตีโดยผู้ที่รักความคิดของเปลือกที่ดีกว่า แต่เกลียด ksh :-)
raminr

145

sh: http://man.cx/sh
bash : http://man.cx/bash

TL; DR : bashเป็นชุดของshไวยากรณ์ที่หรูหรายิ่งขึ้นและฟังก์ชันการทำงานที่มากขึ้น มันปลอดภัยที่จะใช้ bash shebang line ในเกือบทุกกรณีเพราะมันค่อนข้างแพร่หลายในแพลตฟอร์มที่ทันสมัย

หมายเหตุ: ในสภาพแวดล้อมบางอย่างคือsh ตรวจสอบbashsh --version


31
ถ้า bash ถูกเรียกใช้เป็น sh มันจะทำงานแตกต่างกันเล็กน้อย ดูgnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ( "เรียกด้วยชื่อดวลจุดโทษ") และgnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode ตัวอย่างเช่นไม่มีการทดแทนกระบวนการ
เกล็นแจ็คแมน

11
เนื่องจาก bash เป็นชุดของ sh และระบบปฏิบัติการบางอย่างเช่น FreeBSD ไม่มีการติดตั้ง bash โดยค่าเริ่มต้นสคริปต์ใน sh จะให้ความสะดวกในการพกพามากขึ้น
user674062

1
เนื่องจากไม่มีวิธีสคริปต์แบบพกพาในการรับ POSIX เชลล์สำหรับสคริปต์เฉพาะสคริปต์แบบพกพาจึงไม่สามารถถือว่ามากกว่าคุณสมบัติของ Bourne Shell
schily

83

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

ก่อนอื่นคุณควรเข้าใจในสิ่งที่คาดหวัง

  • หากคุณเรียกใช้สคริปต์ของคุณด้วยsh scriptnameหรือเรียกใช้ด้วยscriptnameและมี#!/bin/shในบรรทัดShebangคุณควรคาดหวังshพฤติกรรมPOSIX
  • หากคุณเรียกใช้สคริปต์ของคุณด้วยbash scriptnameหรือเรียกใช้ด้วยscriptnameและมี#!/bin/bash(หรือเทียบเท่าท้องถิ่น) ในบรรทัด shebang คุณควรคาดหวังพฤติกรรม Bash

การมี Shebang ที่ถูกต้องและเรียกใช้สคริปต์โดยการพิมพ์เพียงชื่อสคริปต์ (อาจเป็นแบบสัมพัทธ์หรือเส้นทางแบบเต็ม ) เป็นวิธีแก้ปัญหาที่ต้องการ นอกเหนือจาก shebang ที่ถูกต้องแล้วสิ่งนี้ต้องการไฟล์สคริปต์เพื่อให้มีการเรียกใช้สิทธิ์ ( chmod a+x scriptname)

ดังนั้นพวกเขาต่างกันอย่างไร

คู่มืออ้างอิง Bash มีส่วนที่พยายามระบุความแตกต่างแต่แหล่งที่มาของความสับสนรวมถึง

  • [[ไม่สามารถใช้ได้ในsh( [ซึ่งเป็น clunky และ จำกัด มากขึ้น)
  • sh ไม่มีอาร์เรย์
  • บางคำหลักทุบตีชอบlocal, source, function, shopt, let, declareและไม่ได้พกพาไปselect sh( shรองรับการใช้งานบางอย่างเช่นlocal.)
  • Bash มีส่วนขยายไวยากรณ์แบบ C มากมายเช่นวงสามอาร์กิวเมนต์for((i=0;i<=3;i++)), การ+=เพิ่มขึ้น ฯลฯ$'string\nwith\tC\aescapes'คุณสมบัติเป็นที่ยอมรับอย่างไม่แน่นอนสำหรับ POSIX (หมายถึงมันใช้งานได้ใน Bash ตอนนี้ แต่จะยังไม่รองรับshบนระบบที่ติดอยู่กับปัจจุบันเท่านั้น ข้อมูลจำเพาะ POSIX และมีแนวโน้มว่าจะไม่เกิดขึ้นอีกสักครู่)
  • <<<'here strings'สนับสนุนทุบตี
  • Bash มี*.{png,jpg}และ{0..12}รั้งการขยาย
  • ~อ้างถึง$HOMEใน Bash เท่านั้น (และโดยทั่วไป~usernameจะเป็นโฮมไดเรกทอรีของusername)สิ่งนี้อยู่ใน POSIX แต่อาจหายไปจาก/bin/shการนำไปใช้งานล่วงหน้าของ POSIX
  • ทุบตีมีกระบวนการที่มีการทดแทนและ<(cmd)>(cmd)
  • Bash มีชื่อแทนการเปลี่ยนเส้นทางที่สะดวกสบายแบบ Csh &|สำหรับ2>&1 |และ&>เป็น> ... 2>&1
  • Bash รองรับตัวประมวลผลร่วมด้วยการ<>เปลี่ยนเส้นทาง
  • ทุบตีมีชุดสมบูรณ์ของการขยายการขยายพารามิเตอร์ที่ไม่ได้มาตรฐานเช่น${substring:1:2}, ${variable/pattern/replacement}การแปลงกรณีอื่น ๆ
  • Bash มีการขยายสิ่งอำนวยความสะดวกอย่างมีนัยสำคัญสำหรับการคำนวณทางคณิตศาสตร์ของเชลล์ (แม้ว่าจะยังไม่มีการสนับสนุนจุดลอยตัว) มี$[expression]ไวยากรณ์ที่ล้าสมัยซึ่งควรแทนที่ด้วย$((expression))ไวยากรณ์ทางคณิตศาสตร์ POSIX ( shการปรับใช้pre-POSIX แบบดั้งเดิมบางอย่างอาจไม่สนับสนุนสิ่งนั้น)
  • ตัวแปรเมจิกชอบ$RANDOM, $SECONDS, $PIPESTATUS[@]และ$FUNCNAMEส่วนขยายทุบตี
  • ความแตกต่างของวากยสัมพันธ์เช่นexport variable=valueและ[ "x" == "y" ]ที่ไม่ใช่แบบพกพา ( export variableควรแยกต่างหากจากการกำหนดตัวแปรและการเปรียบเทียบสตริงแบบพกพาในการ[ ... ]ใช้เครื่องหมายเท่ากับเดียว)
  • ส่วนขยาย Bash-only จำนวนมากเพื่อเปิดใช้งานหรือปิดใช้งานพฤติกรรมที่เป็นตัวเลือกและเปิดเผยสถานะภายในของเชลล์
  • คุณลักษณะความสะดวกสบายมากมายสำหรับการใช้งานแบบโต้ตอบซึ่งไม่มีผลต่อพฤติกรรมของสคริปต์

จำไว้ว่านี่เป็นรายการย่อ อ้างถึงคู่มืออ้างอิงสำหรับ scoop แบบเต็มและhttp://mywiki.wooledge.org/Bashismสำหรับวิธีแก้ไขปัญหาที่ดีมากมาย และ / หรือลองใช้http://shellcheck.net/ซึ่งมีคำเตือนสำหรับคุณสมบัติ Bash-only จำนวนมาก

ข้อผิดพลาดทั่วไปคือมี#!/bin/bashแนว Shebang แต่ก็ยังใช้sh scriptnameเพื่อรันสคริปต์ได้ สิ่งนี้จะเป็นการปิดการใช้งานฟังก์ชั่นของ Bash-only เท่านั้นดังนั้นคุณจะได้รับข้อผิดพลาดทางไวยากรณ์เช่นพยายามใช้อาร์เรย์ (บรรทัด shebang เป็นความคิดเห็นทางไวยากรณ์ดังนั้นจึงไม่สนใจในสถานการณ์นี้)

shแต่น่าเสียดายที่จะไม่ได้ทุบตีเตือนเมื่อคุณพยายามที่จะใช้โครงสร้างเหล่านี้เมื่อมันถูกเรียกว่าเป็น มันไม่ได้ปิดการใช้งานฟังก์ชั่น Bash-only ทั้งหมดอย่างสมบูรณ์ดังนั้นจึงควรรัน Bash ด้วยการเรียกใช้เนื่องจากshไม่ใช่วิธีที่ดีในการตรวจสอบว่าสคริปต์ของคุณพกพาได้อย่างถูกต้องไปที่ash/ dash/ POSIX shหรือตัวแปรเช่นHeirloomsh


2
พื้นฐานการ TL; DR ersion คือคำตอบและของ
tripleee

4
shellcheck.netคือทั้งหมดที่ฉันต้องการ ขอบคุณมาก.
Josh Habdas

FWIW, export variable=valueจะได้รับคำสั่งจาก POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html บางทีมันอาจจะไม่มีในเปลือกหอยโบราณบางตัว แต่มันก็ไม่ใช่การทุบตีอย่างแน่นอน
Roman Cheplyaka

53

Shellเป็นส่วนต่อประสานระหว่างผู้ใช้และระบบปฏิบัติการเพื่อเข้าถึงบริการของระบบปฏิบัติการ สามารถเป็นได้ทั้ง GUI หรือ CLI (อินเตอร์เฟสบรรทัดคำสั่ง)

sh (Bourne sh ell) เป็นล่ามบรรทัดคำสั่งสำหรับระบบปฏิบัติการแบบ Unix / Unix มันมีคำสั่งในตัวบางอย่าง #!/bin/shในภาษาสคริปต์ที่เราแสดงเป็นล่าม มันเป็นหนึ่งในการสนับสนุนอย่างกว้างขวางที่สุดโดยกระสุนอื่น ๆ เช่น bash (free / open), kash (ไม่ฟรี)

Bash ( B ourne a a Hell s gain ) เป็นการแทนที่เชลล์สำหรับ Bourne shell ทุบตีคือ superset ของ sh Bash รองรับการดวลจุดโทษ POSIX เป็นชุดของมาตรฐานที่กำหนดวิธีการทำงานของระบบที่สอดคล้องกับ POSIX Bash ไม่ได้เป็นเปลือกที่สอดคล้องกับ POSIX #!/bin/bashในภาษาสคริปต์ที่เราแสดงล่ามเป็น

การเปรียบเทียบ:

  • เชลล์เปรียบเสมือนส่วนต่อประสานหรือข้อมูลจำเพาะหรือ API
  • sh เป็นคลาสที่ใช้อินเตอร์เฟสของเชลล์
  • Bash เป็นคลาสย่อยของ sh

ป้อนคำอธิบายรูปภาพที่นี่


3
ฉันไม่เข้าใจ คุณได้พูดถึงทั้ง "Bash is superset of sh" และ "Bash เป็น subclass ของ sh" พวกเขาไม่ได้พูดอย่างนั้นหรือ คุณช่วยอธิบายได้ไหม?
กีรนาปราการะรัน

11
ฉันคิดว่านี่เป็นความพยายามที่จะบอกว่า Bash สืบทอดมาจากsh(ดังนั้นจึงเป็น "subclass" ในความหมายของ OOP) และขยายให้กว้างขึ้น
tripleee

52

โพสต์จากUNIX.COM

คุณสมบัติของเชลล์

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

รหัส:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

กุญแจไปที่ตารางด้านบน

คุณสมบัติ Y สามารถทำได้โดยใช้เปลือกนี้

N คุณสมบัติไม่มีอยู่ในเปลือก

คุณสมบัติ F สามารถทำได้โดยใช้กลไกการทำงานของเชลล์

L ไลบรารี readline ต้องเชื่อมโยงเข้ากับเชลล์เพื่อเปิดใช้งานฟีเจอร์นี้

หมายเหตุถึงตารางด้านบน

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.

ตารางของคุณไม่มีประโยชน์สำหรับฉันเนื่องจากพยายามเปรียบเทียบคุณสมบัติของ Bourne Shell และคุณลักษณะจาก ksh ก่อนปี 1988 ถ้าคุณสร้างตารางสำหรับปี 1988 คุณจะต้องลบเชลล์อื่น ๆ ส่วนใหญ่ออกจากตารางนั้น - รวมถึง bash , sh และ rc คุณสามารถอธิบายได้ว่าคุณได้รับค่าสำหรับตารางของคุณจากที่ใด
schily

1
ให้ฉันให้คำแนะนำบางอย่าง: การควบคุมงานถูกเพิ่มเข้าไปใน Bourne Shell ในปี 1989 และ Bourne Shell ได้ทำ OpenSource ในปี 2005 Korn เชลล์มีการทดแทนกระบวนการตั้งแต่อย่างน้อยปี 1988 และเป็น OpenSource ตั้งแต่ปี 1997 BTW: ข้อความของคุณเกี่ยวกับ $ ENV ไม่ถูกต้อง $ ENV จะอ่าน / เรียกใช้สำหรับเชลล์แบบโต้ตอบเท่านั้น
schily

3
@schily โพสต์นี้ถูกจับจากcs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV

@schily หากคุณรู้สึกว่ามันไม่ถูกต้องที่ใดก็ได้โปรดแก้ไขอย่างเหมาะสม
SriniV

8
ดูเหมือนว่ามันจะเป็นการดีกว่าที่จะลบคำตอบนี้ออกไปเพราะมันเป็นการหลอกลวงอย่างแท้จริงและ OP ไม่ได้ตรวจสอบข้อมูลที่เขาวางไว้จริงๆ
danno

24

TERMINAL

  • โปรแกรมที่วางหน้าต่าง
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm และ eterm

เปลือก

  • เป็นโปรแกรมที่รันในเทอร์มินัล
  • Shell เป็นทั้งตัวแปลคำสั่งและภาษาการเขียนโปรแกรม
  • เชลล์เป็นเพียงตัวประมวลผลแมโครที่ดำเนินการคำสั่ง
  • ตัวประมวลผลแมโครหมายถึงฟังก์ชันการทำงานที่ขยายข้อความและสัญลักษณ์เพื่อสร้างนิพจน์ที่ใหญ่ขึ้น

SH เทียบกับ ทุบตี

SH

  • (เปลือก)
  • เป็นหอยเฉพาะ
  • ล่ามคำสั่งและภาษาการเขียนโปรแกรม
  • บรรพบุรุษของ BASH

ทุบตี

  • (เชลล์เป้าหมายอีกครั้ง)
  • เป็นหอยเฉพาะ
  • ล่ามคำสั่งและภาษาการเขียนโปรแกรม
  • มีฟังก์ชั่น SH และอีกมากมาย
  • ตัวตายตัวแทนของ SH
  • BASH คือเชลล์เริ่มต้น

วัสดุอ้างอิง:

SHELL gnu.org:

ที่ฐานของมันเชลล์เป็นเพียงตัวประมวลผลแมโครที่ดำเนินการคำสั่ง คำว่าตัวประมวลผลแมโครหมายถึงฟังก์ชันที่ข้อความและสัญลักษณ์ถูกขยายเพื่อสร้างนิพจน์ที่ใหญ่ขึ้น

Unix shell เป็นทั้งตัวแปลคำสั่งและภาษาการเขียนโปรแกรม ในฐานะที่เป็นล่ามคำสั่งเชลล์จะให้ส่วนต่อประสานผู้ใช้กับชุดยูทิลิตี้ GNU ที่หลากหลาย คุณสมบัติภาษาการเขียนโปรแกรมอนุญาตให้รวมยูทิลิตี้เหล่านี้ ไฟล์ที่มีคำสั่งสามารถสร้างได้และกลายเป็นคำสั่งด้วยตนเอง คำสั่งใหม่เหล่านี้มีสถานะเดียวกับคำสั่งระบบในไดเรกทอรีเช่น / bin ช่วยให้ผู้ใช้หรือกลุ่มสามารถสร้างสภาพแวดล้อมแบบกำหนดเองเพื่อทำงานทั่วไปโดยอัตโนมัติ

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

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

หอยยังให้ชุดเล็ก ๆ ของตัวคำสั่ง (builtins) การดำเนินการการทำงานไปไม่ได้หรือไม่สะดวกที่จะได้รับผ่านทางสาธารณูปโภคแยกต่างหาก ตัวอย่างเช่น cd, break, continue และ exec ไม่สามารถนำไปใช้นอกเชลล์ได้เพราะมันจัดการกับเชลล์โดยตรง ประวัติ getopts, kill หรือ pwd builtins สามารถนำมาใช้ในยูทิลิตี้แยกต่างหาก แต่สะดวกกว่าที่จะใช้เป็นคำสั่ง builtin ตัวบิวด์เชลล์ทั้งหมดอธิบายไว้ในส่วนต่อไป

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

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

BASH gnu.org:

Bash คือเชลล์หรือล่ามภาษาคำสั่งสำหรับระบบปฏิบัติการ GNU ชื่อนี้เป็นอักษรย่อของ 'Bourne-Again SHell' ซึ่งเป็นคำสั่งของ Stephen Bourne ผู้แต่งบรรพบุรุษโดยตรงของ Unix shell sh ปัจจุบันซึ่งปรากฏในรุ่นทดลองที่เจ็ดของ Bell Labs ของ Unix

ทุบตีส่วนใหญ่เข้ากันได้กับ sh และรวมคุณสมบัติที่มีประโยชน์จาก Korn เชลล์ ksh และ C เชลล์ csh มีวัตถุประสงค์เพื่อให้สอดคล้องกับการใช้งาน IEEE POSIX Shell และเครื่องมือในส่วนของข้อมูลจำเพาะ IEEE POSIX (มาตรฐาน IEEE 1003.1) มันมีการปรับปรุงการทำงานมากกว่า SH สำหรับการใช้งานแบบโต้ตอบและการเขียนโปรแกรม

ในขณะที่ระบบปฏิบัติการ GNU ให้เปลือกหอยอื่น ๆ รวมถึงรุ่นของ csh การทุบตีเปลือกเริ่มต้น เช่นเดียวกับซอฟต์แวร์ GNU อื่น ๆ Bash นั้นค่อนข้างพกพาได้ ปัจจุบันทำงานบน Unix เกือบทุกรุ่นและระบบปฏิบัติการอื่น ๆ สองสามพอร์ต - มีพอร์ตที่รองรับโดยอิสระสำหรับ MS-DOS, OS / 2 และแพลตฟอร์ม Windows


14

คำตอบอื่น ๆ โดยทั่วไปชี้ให้เห็นถึงความแตกต่างระหว่าง Bash และ POSIX เชลล์มาตรฐาน อย่างไรก็ตามเมื่อเขียนสคริปต์เชลล์แบบพกพาและใช้กับไวยากรณ์ Bash รายการ bashisms ทั่วไปและโซลูชัน POSIX บริสุทธิ์ที่สอดคล้องกันนั้นมีประโยชน์มาก รายการดังกล่าวได้รับการรวบรวมเมื่อ Ubuntu เปลี่ยนจาก Bash เป็น Dash เป็นเชลล์ระบบเริ่มต้นและสามารถพบได้ที่นี่: https://wiki.ubuntu.com/DashAsBinSh

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


นี่เป็นสิ่งที่คำตอบของฉัน ณ ตอนนี้ทำให้ฉันเดือดร้อน +1
tripleee

7

พวกเขาเกือบจะเท่ากัน แต่bashมีคุณสมบัติมากขึ้น - shเป็น (มากหรือน้อย) bashเซตเก่า

shมักจะหมายถึงต้นฉบับBourne shellซึ่งถือกำเนิดขึ้นมาbash( Bourne *again* shell) และถูกสร้างขึ้นในปี 1977 แต่ในทางปฏิบัติมันอาจจะดีกว่าที่จะคิดว่ามันเป็นเปลือกที่เข้ากันได้ข้ามสูงที่สอดคล้องกับมาตรฐาน POSIX จากปี 1992

สคริปต์ที่เริ่มต้นด้วย#!/bin/shหรือใช้shเชลล์มักจะทำเพื่อความเข้ากันได้ย้อนหลัง ระบบปฏิบัติการ unix / linux ใด ๆ จะมีshเชลล์ บน Ubuntu shมักจะเรียกdashและ MacOS มันเป็นพิเศษรุ่น POSIX bashของ เชลล์เหล่านี้อาจเป็นที่ต้องการสำหรับการทำงานตามมาตรฐานความเร็วหรือความเข้ากันได้ย้อนหลัง

bashใหม่กว่าเดิมsh, shเพิ่มคุณสมบัติมากขึ้นและพยายามที่จะย้อนกลับเข้ากันได้กับ ในทางทฤษฎีโปรแกรมควรจะทำงานใน sh สามารถใช้ได้กับเครื่อง linux / unix เกือบทุกเครื่องและโดยปกติแล้วจะใช้งานตามค่าเริ่มต้น - โดยมีข้อยกเว้นที่น่าสังเกตของการกำหนดค่าเริ่มต้นของ MacOS เป็น Catalina (10.15) โดยค่าเริ่มต้น FreeBSD จะไม่ได้รับการติดตั้งbashbashzshbash


shก่อนหน้านี้ไกล POSIX วันนี้คุณหวังว่าทุกshสิ่งที่คุณพบจะเข้ากันได้กับ POSIX เป็นอย่างน้อย แต่ในระบบดั้งเดิมนี่ไม่ใช่การให้ POSIX stadardizes มากกว่าเปลือก; ในความเป็นจริงคุณสามารถยืนยันว่ามาตรฐานของการเรียกระบบปฏิบัติการและฟังก์ชั่นห้องสมุดมีความสำคัญมากขึ้น
tripleee

ฉันลบสิ่งที่เกี่ยวกับ POSIX เพื่อทำให้สับสนน้อยลง
Ryan Taylor

3

/bin/sh/bin/bashหรืออาจจะไม่เรียกใช้โปรแกรมเดียวกับ

shรองรับคุณสมบัติที่POSIXใช้เป็นอย่างน้อย (สมมติว่ามีการใช้งานที่ถูกต้อง) มันอาจรองรับส่วนขยายเช่นกัน

bash"Bourne Again Shell" ใช้คุณลักษณะที่จำเป็นสำหรับ sh บวกส่วนขยายเฉพาะ bash ชุดเต็มของส่วนขยายยาวเกินกว่าจะอธิบายได้ที่นี่และมันแตกต่างกันไปตามรุ่นใหม่ ความแตกต่างถูกบันทึกไว้ในคู่มือทุบตี พิมพ์info bashและการอ่าน "ทุบตีคุณสมบัติ" ส่วน (มาตรา 6 ในรุ่นปัจจุบัน) หรืออ่านเอกสารออนไลน์ในปัจจุบัน


shให้ POSIX เชลล์แก่คุณเท่านั้นหากคุณมีการPATHตั้งค่าที่ถูกต้องในเชลล์ปัจจุบันของคุณ ไม่มีชื่อเส้นทางที่กำหนดไว้ซึ่งจะให้เชลล์ POSIX แก่คุณ
schily

เป็นเวลานานshไม่จำเป็นว่าจะต้องให้ POSIX เชลล์กับคุณบน Solaris
tripleee

3

bash และ sh เป็นสองเชลล์ที่แตกต่างกัน ทุบตีโดยทั่วไปคือ sh มีคุณสมบัติมากขึ้นและไวยากรณ์ที่ดีขึ้น คำสั่งส่วนใหญ่ทำงานเหมือนกัน แต่แตกต่างกันทุบตี (ทุบตี) เป็นหนึ่งในหลาย ๆ เชลล์ที่มี (ยังใช้กันมากที่สุด) เชลล์ Unix Bash ย่อมาจาก "Bourne Again SHell" และเป็นการแทนที่ / ปรับปรุงเชลล์ Bourne ดั้งเดิม (sh)

การเขียนสคริปต์เชลล์ทำสคริปต์ในเชลล์ใด ๆ ในขณะที่การสคริปต์ Bash เป็นการสคริปต์เฉพาะสำหรับ Bash อย่างไรก็ตามในทางปฏิบัติ "shell script" และ "bash script" มักจะใช้แทนกันได้ยกเว้นว่าเชลล์ที่มีปัญหานั้นไม่ใช่ Bash

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


0

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

Shell - "Shell" เป็นโปรแกรมที่อำนวยความสะดวกในการโต้ตอบระหว่างผู้ใช้และระบบปฏิบัติการ (เคอร์เนล) มีการใช้งานเชลล์หลายอย่างเช่น sh, bash, csh, zsh ... เป็นต้น

การใช้โปรแกรมเชลล์ใด ๆ เราจะสามารถดำเนินการคำสั่งที่สนับสนุนโดยโปรแกรมเชลล์นั้นได้

ทุบตี - มันมาจากB ourne- กำไรSh ell การใช้โปรแกรมนี้เราจะสามารถดำเนินการคำสั่งทั้งหมดที่ระบุโดยเชลล์ นอกจากนี้เราจะสามารถดำเนินการคำสั่งบางอย่างที่เพิ่มเข้ามาในโปรแกรมนี้โดยเฉพาะ Bash มีความเข้ากันได้ย้อนหลังกับ sh

Sh - มันได้มาจาก Bourne Sh ell "sh" รองรับคำสั่งทั้งหมดที่ระบุในเชลล์ หมายถึงการใช้โปรแกรมนี้เราจะสามารถดำเนินการคำสั่งทั้งหมดที่ระบุโดยเชลล์

สำหรับข้อมูลเพิ่มเติมให้ทำ: - https://man.cx/sh - https://man.cx/bash


เพื่อทำความเข้าใจ POSIX อ่านคำตอบจากAlex โปรดตรวจสอบ: stackoverflow.com/a/1780614/1261003
Raihanhbh

ฉันไม่ได้พยายามเข้าใจ POSIX ฉันกำลังตรวจสอบคำตอบของคุณและฉันจำเป็นต้องเห็นว่าคำตอบของคุณเพิ่มคุณค่า ฉันไม่คิดว่ามันจะ
Scratte

ฉันเชื่อว่าคำอธิบายเล็ก ๆ เหล่านี้จะช่วยสามเณรที่จะเข้าใจศัพท์แสงที่ใช้ในการสนทนาข้างต้นได้อย่างสะดวกสบายยิ่งขึ้น @Scratte
Raihanhbh

-1

ระบบปฏิบัติการ Linux มีเชลล์หลากหลายประเภท แม้ว่าเชลล์จะมีคำสั่งมากมายเหมือนกัน แต่แต่ละชนิดก็มีคุณสมบัติที่เป็นเอกลักษณ์ ลองศึกษาเปลือกหอยที่ใช้กันเป็นส่วนใหญ่

เปลือก SH:

Sh shell เป็นที่รู้จักกันในนาม Bourne Shell Sh shell เป็นเชลล์ตัวแรกที่พัฒนาขึ้นสำหรับคอมพิวเตอร์ Unix โดย Stephen Bourne ที่ Bell Labs ของ AT&T ในปี 1977 ซึ่งมีเครื่องมือสคริปต์มากมาย

เปลือกทุบตี:

Bash shell ย่อมาจาก Bourne Again Shell Bash shell เป็นเชลล์เริ่มต้นในการกระจาย linux ส่วนใหญ่และใช้แทน Sh Shell (เชลล์ SH จะทำงานในเชลล์ Bash) Bash Shell สามารถใช้งานสคริปต์เชลล์ส่วนใหญ่ได้โดยไม่ต้องทำการดัดแปลงใด ๆ และยังมีคุณสมบัติการแก้ไขบรรทัดคำสั่งอีกด้วย


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