เมื่อมีการเขียนโปรแกรมเปลือกเรามักจะใช้และ/bin/sh
/bin/bash
ฉันมักจะใช้bash
แต่ฉันไม่รู้ว่าอะไรคือความแตกต่างระหว่างพวกเขา
ความแตกต่างหลักระหว่างbash
และsh
คืออะไร
เราทำอะไรจะต้องตระหนักว่าเมื่อการเขียนโปรแกรมในbash
และsh
?
เมื่อมีการเขียนโปรแกรมเปลือกเรามักจะใช้และ/bin/sh
/bin/bash
ฉันมักจะใช้bash
แต่ฉันไม่รู้ว่าอะไรคือความแตกต่างระหว่างพวกเขา
ความแตกต่างหลักระหว่างbash
และsh
คืออะไร
เราทำอะไรจะต้องตระหนักว่าเมื่อการเขียนโปรแกรมในbash
และ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
ถ้าเรียกว่าเป็น
เป็นเวลานานที่/bin/sh
จะใช้ชี้ไป/bin/bash
ที่ระบบ GNU / Linux ส่วนใหญ่ เป็นผลให้มันเกือบจะปลอดภัยที่จะเพิกเฉยความแตกต่างระหว่างทั้งสอง แต่นั่นเริ่มเปลี่ยนไปเมื่อเร็ว ๆ นี้
ตัวอย่างที่นิยมของระบบที่/bin/sh
ไม่ได้ชี้ไปที่/bin/bash
(และในบางระบบ/bin/bash
อาจไม่มีอยู่) คือ:
sh
ไปdash
โดยค่าเริ่มต้นinitramfs
ซึ่งดำเนินการปกติในช่วงเวลาการบูตระบบลินุกซ์เป็นส่วนหนึ่งของ มันใช้การใช้ash
เปลือก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 »เป็นบรรทัดแรกของสคริปต์
เช่น
#!/bin/sh
จะใช้sh
(และอะไรก็ตามที่เกิดขึ้นกับจุด)
#!/bin/bash
จะใช้/bin/bash
ถ้ามันมีอยู่ (และล้มเหลวพร้อมกับข้อความแสดงข้อผิดพลาดหากไม่มี) แน่นอนคุณยังสามารถระบุการนำไปใช้อื่นเช่น
#!/bin/dash
สำหรับสคริปต์ของฉันเองฉันชอบsh
ด้วยเหตุผลดังต่อไปนี้:
bash
พวกเขาจะต้องมีsh
มีข้อดีในการใช้bash
เช่นกัน คุณสมบัติต่างๆทำให้การเขียนโปรแกรมสะดวกและคล้ายกับการเขียนโปรแกรมในภาษาการเขียนโปรแกรมสมัยใหม่อื่น ๆ สิ่งเหล่านี้รวมถึงสิ่งต่าง ๆ เช่นตัวแปรและอาร์เรย์ในตัวเครื่อง ธรรมดาsh
เป็นภาษาโปรแกรมเรียบง่ายมาก
bash
วิธีแสดงข้อความข้อผิดพลาดที่เป็นประโยชน์มากขึ้นในกรณีของข้อผิดพลาดทางไวยากรณ์ คุณสามารถประหยัดเวลาได้ง่ายๆด้วยการใช้ bash
%
หมายถึงจุดเริ่มต้นของบรรทัดคำสั่งของคุณ?
$
แทน%
หรือ#
สำหรับรูทเชลล์
$
และ#
...
sh
มีอยู่ก่อน bash (ซึ่งย่อมาจากเปลือก bourne-again) แต่มันดั้งเดิมมากและไม่ตอบสนองต่อเหตุการณ์เทอร์มินัลเช่นESC
ตัวละคร จากนั้นksh
ก็มาถึง (ก่อนที่จะทุบตี) แล้วทุบตีโดยผู้ที่รักความคิดของเปลือกที่ดีกว่า แต่เกลียด ksh :-)
sh
: http://man.cx/sh
bash
: http://man.cx/bash
TL; DR : bash
เป็นชุดของsh
ไวยากรณ์ที่หรูหรายิ่งขึ้นและฟังก์ชันการทำงานที่มากขึ้น มันปลอดภัยที่จะใช้ bash shebang line ในเกือบทุกกรณีเพราะมันค่อนข้างแพร่หลายในแพลตฟอร์มที่ทันสมัย
หมายเหตุ: ในสภาพแวดล้อมบางอย่างคือsh
ตรวจสอบbash
sh --version
คำถามนี้ได้รับการเสนอชื่อเข้าชิงบ่อยเป็นที่ยอมรับสำหรับคนที่พยายามที่จะใช้และจะประหลาดใจว่ามันไม่ได้มีพฤติกรรมเช่นเดียวกับsh
bash
ต่อไปนี้เป็นบทสรุปโดยย่อเกี่ยวกับความเข้าใจผิดและข้อผิดพลาดทั่วไป
ก่อนอื่นคุณควรเข้าใจในสิ่งที่คาดหวัง
sh scriptname
หรือเรียกใช้ด้วยscriptname
และมี#!/bin/sh
ในบรรทัดShebangคุณควรคาดหวังsh
พฤติกรรมPOSIXbash 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
.)for((i=0;i<=3;i++))
, การ+=
เพิ่มขึ้น ฯลฯ$'string\nwith\tC\aescapes'
คุณสมบัติเป็นที่ยอมรับอย่างไม่แน่นอนสำหรับ POSIX (หมายถึงมันใช้งานได้ใน Bash ตอนนี้ แต่จะยังไม่รองรับsh
บนระบบที่ติดอยู่กับปัจจุบันเท่านั้น ข้อมูลจำเพาะ POSIX และมีแนวโน้มว่าจะไม่เกิดขึ้นอีกสักครู่)<<<'here strings'
สนับสนุนทุบตี*.{png,jpg}
และ{0..12}
รั้งการขยาย~
อ้างถึง$HOME
ใน Bash เท่านั้น (และโดยทั่วไป~username
จะเป็นโฮมไดเรกทอรีของusername
)/bin/sh
การนำไปใช้งานล่วงหน้าของ POSIX<(cmd)
>(cmd)
&|
สำหรับ2>&1 |
และ&>
เป็น> ... 2>&1
<>
เปลี่ยนเส้นทาง${substring:1:2}
, ${variable/pattern/replacement}
การแปลงกรณีอื่น ๆ$[expression]
ไวยากรณ์ที่ล้าสมัยซึ่งควรแทนที่ด้วย$((expression))
ไวยากรณ์ทางคณิตศาสตร์ POSIX ( sh
การปรับใช้pre-POSIX แบบดั้งเดิมบางอย่างอาจไม่สนับสนุนสิ่งนั้น)$RANDOM
, $SECONDS
, $PIPESTATUS[@]
และ$FUNCNAME
ส่วนขยายทุบตีexport variable=value
และ[ "x" == "y" ]
ที่ไม่ใช่แบบพกพา ( export variable
ควรแยกต่างหากจากการกำหนดตัวแปรและการเปรียบเทียบสตริงแบบพกพาในการ[ ... ]
ใช้เครื่องหมายเท่ากับเดียว)จำไว้ว่านี่เป็นรายการย่อ อ้างถึงคู่มืออ้างอิงสำหรับ 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
export variable=value
จะได้รับคำสั่งจาก POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html บางทีมันอาจจะไม่มีในเปลือกหอยโบราณบางตัว แต่มันก็ไม่ใช่การทุบตีอย่างแน่นอน
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
ในภาษาสคริปต์ที่เราแสดงล่ามเป็น
การเปรียบเทียบ:
sh
(ดังนั้นจึงเป็น "subclass" ในความหมายของ OOP) และขยายให้กว้างขึ้น
โพสต์จาก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.
TERMINAL
เปลือก
SH เทียบกับ ทุบตี
SH
ทุบตี
วัสดุอ้างอิง:
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
คำตอบอื่น ๆ โดยทั่วไปชี้ให้เห็นถึงความแตกต่างระหว่าง Bash และ POSIX เชลล์มาตรฐาน อย่างไรก็ตามเมื่อเขียนสคริปต์เชลล์แบบพกพาและใช้กับไวยากรณ์ Bash รายการ bashisms ทั่วไปและโซลูชัน POSIX บริสุทธิ์ที่สอดคล้องกันนั้นมีประโยชน์มาก รายการดังกล่าวได้รับการรวบรวมเมื่อ Ubuntu เปลี่ยนจาก Bash เป็น Dash เป็นเชลล์ระบบเริ่มต้นและสามารถพบได้ที่นี่: https://wiki.ubuntu.com/DashAsBinSh
นอกจากนี้ยังมีเครื่องมือที่ยอดเยี่ยมที่เรียกว่าcheckbashismsที่ตรวจสอบ bashisms ในสคริปต์ของคุณและมีประโยชน์เมื่อคุณต้องการให้แน่ใจว่าสคริปต์ของคุณพกพาได้
พวกเขาเกือบจะเท่ากัน แต่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 จะไม่ได้รับการติดตั้งbash
bash
zsh
bash
sh
ก่อนหน้านี้ไกล POSIX วันนี้คุณหวังว่าทุกsh
สิ่งที่คุณพบจะเข้ากันได้กับ POSIX เป็นอย่างน้อย แต่ในระบบดั้งเดิมนี่ไม่ใช่การให้ POSIX stadardizes มากกว่าเปลือก; ในความเป็นจริงคุณสามารถยืนยันว่ามาตรฐานของการเรียกระบบปฏิบัติการและฟังก์ชั่นห้องสมุดมีความสำคัญมากขึ้น
/bin/sh
/bin/bash
หรืออาจจะไม่เรียกใช้โปรแกรมเดียวกับ
sh
รองรับคุณสมบัติที่POSIXใช้เป็นอย่างน้อย (สมมติว่ามีการใช้งานที่ถูกต้อง) มันอาจรองรับส่วนขยายเช่นกัน
bash
"Bourne Again Shell" ใช้คุณลักษณะที่จำเป็นสำหรับ sh บวกส่วนขยายเฉพาะ bash ชุดเต็มของส่วนขยายยาวเกินกว่าจะอธิบายได้ที่นี่และมันแตกต่างกันไปตามรุ่นใหม่ ความแตกต่างถูกบันทึกไว้ในคู่มือทุบตี พิมพ์info bash
และการอ่าน "ทุบตีคุณสมบัติ" ส่วน (มาตรา 6 ในรุ่นปัจจุบัน) หรืออ่านเอกสารออนไลน์ในปัจจุบัน
sh
ให้ POSIX เชลล์แก่คุณเท่านั้นหากคุณมีการPATH
ตั้งค่าที่ถูกต้องในเชลล์ปัจจุบันของคุณ ไม่มีชื่อเส้นทางที่กำหนดไว้ซึ่งจะให้เชลล์ POSIX แก่คุณ
sh
ไม่จำเป็นว่าจะต้องให้ POSIX เชลล์กับคุณบน Solaris
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 เพราะผู้สร้างสคริปต์สันนิษฐานว่าลิงก์คือการทุบตีเมื่อไม่จำเป็นต้องเป็น
ความแตกต่างง่ายที่สุดเท่าที่จะเป็นไปได้: หลังจากมีความเข้าใจพื้นฐานความคิดเห็นอื่น ๆ ที่โพสต์ข้างต้นจะง่ายต่อการจับ
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
ระบบปฏิบัติการ 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 สามารถใช้งานสคริปต์เชลล์ส่วนใหญ่ได้โดยไม่ต้องทำการดัดแปลงใด ๆ และยังมีคุณสมบัติการแก้ไขบรรทัดคำสั่งอีกด้วย