ฉันใหม่สำหรับ Ubuntu ฉันได้ยินคนพูดว่า "shell scripting", "bash scripting"
ฉันสงสัยว่าพวกเขาเหมือนกันหรือไม่ หรือพวกเขาแตกต่างกันอย่างไร
ฉันใหม่สำหรับ Ubuntu ฉันได้ยินคนพูดว่า "shell scripting", "bash scripting"
ฉันสงสัยว่าพวกเขาเหมือนกันหรือไม่ หรือพวกเขาแตกต่างกันอย่างไร
คำตอบ:
Bash ( bash
) เป็นหนึ่งในหลาย ๆ ที่มี (ยังใช้มากที่สุด) Unix shells Bash ย่อมาจาก " B ourne A gain SH ell" และเป็นการแทนที่ / ปรับปรุงเชลล์เป้าหมายเดิม ( sh
)
การเขียนสคริปต์เชลล์ทำสคริปต์ในเชลล์ใด ๆในขณะที่การสคริปต์ Bash เป็นการสคริปต์เฉพาะสำหรับ Bash อย่างไรก็ตามในทางปฏิบัติ "shell script" และ "bash script" มักจะใช้แทนกันได้ยกเว้นว่าเชลล์ที่มีปัญหานั้นไม่ใช่ Bash
แก้ไข: ที่จริงแล้วเชลล์สคริปต์เริ่มต้นใน Ubuntu เป็นเส้นประในขณะที่เชลล์แบบโต้ตอบเริ่มต้น (สิ่งที่คุณจะได้รับหากคุณดึงเทอร์มินัล) คือ Bash อย่างไรก็ตามทั้งสองคำนี้ยังคงใช้แทนกันได้เป็นส่วนใหญ่
/bin/sh
เป็น symlink ไป/bin/dash
ทำให้เริ่มต้นระบบเปลือก แต่ยังไม่ได้เริ่มต้นการเขียนสคริปต์/bin/sh
เปลือกคือไม่มีกฎที่เขียนอย่างที่คุณต้องใช้ เมื่อใช้อย่างใดอย่างหนึ่ง/bin/sh
นั้นเป็นเหตุผลหลักในการพกพาเมื่อคุณคาดว่าสคริปต์ของคุณจะใช้บนแพลตฟอร์มระบบปฏิบัติการ Unix ที่มีลักษณะคล้าย Unix ซึ่งส่วนใหญ่จะมี/bin/sh
เชลล์ Bourne-compliant POSIX-compliant
บทนำ
การเขียนสคริปต์และการเขียนสคริปต์ของเชลล์Bash
ไม่ใช่สิ่งเดียวกันเนื่องจากมีเชลล์อื่นอยู่เช่นsh
ที่สามารถใช้ในการเรียกใช้สคริปต์ สคริปต์ที่ต้องการดำเนินการโดยBash
ควรถูกระบุว่าเป็นBash
สคริปต์ ข้อกำหนดมักใช้แทนกันได้เนื่องจากBash
ด้วยฟังก์ชันการทำงานที่ขยายเพิ่มขึ้นเมื่อเปรียบเทียบกับsh
เป็นข้อกำหนดที่ใช้บ่อยที่สุดในการเรียกใช้สคริปต์ผู้ใช้ในการแจกแจงจำนวนมาก อย่างไรก็ตามมีเชลล์อื่น ๆ เช่นKorn (ksh)
, C shell (csh)
และZ shell (zsh)
, แต่เราจะไม่เข้าไปที่นี่เพื่อพูดคุยsh
และbash
เกี่ยวข้องกับ Ubuntu มากที่สุด บทความ IBM ที่ยอดเยี่ยมที่นี่จะกล่าวถึงรายละเอียดเพิ่มเติมเกี่ยวกับวิวัฒนาการของเชลล์ใน Linux และอธิบายถึงสถาปัตยกรรมของเชลล์และความแตกต่างของเชลล์
การเขียนสคริปต์เชลล์
Sh
เป็นเปลือก Unix ดั้งเดิมที่พัฒนาโดย Stephen Bourne; อย่างไรก็ตามระบบที่ใช้ Debian และ Ubuntu ถือว่าเชลล์dash
เป็นของพวกเขาsh
( sh
เป็น symlinked จริง ๆdash
) ใน Debian และ Ubuntu เนื่องจากความเร็วsh
มันถูกใช้บ่อยสำหรับโพรซีเดอร์ระบบที่สำคัญและสำหรับการเรียกใช้งานสคริปต์คีย์เมื่อเริ่มต้น เพื่อดูรายละเอียดเพิ่มเติมโปรดดูที่วิกิพีเดียอูบุนตู Bash
ย่อมาจาก Bourne Again SHell และได้รับการพัฒนาในภายหลังโดย Brian Fox และขยายต้นฉบับsh
มาก การพัฒนาสุนัขจิ้งจอกและอื่น ๆBash
เป็นส่วนสำคัญของโครงการ GNU ดูนี้การอภิปรายที่ดีของประวัติศาสตร์ของBash
สำหรับข้อมูลเพิ่มเติม
เป็นสิ่งสำคัญที่จะต้องทราบว่าทั้งสองอย่างsh
และBash
ตามที่ใช้ใน Ubuntu และการกระจายอื่น ๆ นั้นเป็นPOSIX
ไปตามมาตรฐานซึ่งหมายความว่าพวกเขาสมัครเป็นสมาชิกของมาตรฐานจำนวนมากเกี่ยวกับวิธีดำเนินการคำสั่งในเชลล์ นี่คือเพื่อให้แน่ใจว่าผลลัพธ์ของสคริปต์ที่ใช้ในระบบปฏิบัติการสามารถคาดการณ์ได้อย่างน่าเชื่อถือและพฤติกรรมของเชลล์สามารถเก็บไว้ในPOSIX
พารามิเตอร์เหล่านั้นได้ซึ่งเป็นสิ่งสำคัญอย่างยิ่งสำหรับนักพัฒนา สำหรับข้อมูลเพิ่มเติมเกี่ยวกับมาตรฐานให้ดูเอกสารอย่างเป็นทางการ
บ่อยครั้งที่เชลล์สคริปต์มีคำต่อท้าย.sh
แม้ว่าพวกเขาจะตั้งใจที่จะดำเนินการเป็นbash
สคริปต์และมี#!/bin/bash
ที่ด้านบนของสคริปต์ มันจริงไม่สำคัญว่าสคริปต์ที่เรียกว่าscript.shหรือmy.scriptสิ่งที่สำคัญก็คือว่าการเรียกร้องให้ล่ามหรือ/bin/sh
/bin/bash
เชลล์สคริปต์ยังสามารถเรียกว่าในบรรทัดคำสั่งอย่างใดอย่างหนึ่งหรือsh
bash
แต่ก็เป็นสิ่งสำคัญที่จะต้องทราบว่าผลที่ได้จะแตกต่างกันขึ้นอยู่กับล่ามเรียกว่าเป็นไม่ทุกbash
คำสั่งจะทำงานในsh
ขณะที่ส่วนใหญ่คำสั่งจะทำงานในsh
bash
โดยทั่วไปผู้ใช้ส่วนใหญ่จะต้องการใช้/bin/bash
สคริปต์ของพวกเขาเพื่อให้สามารถใช้ประโยชน์จากชุดคุณสมบัติเพิ่มเติม; สคริปต์ของระบบสามารถดำเนินการได้/bin/sh
หากจำเป็น
ทรัพยากรสำหรับการเขียนสคริปต์ Bash Shell
บางครั้งการค้นหาแหล่งข้อมูลที่เป็นประโยชน์ทางออนไลน์เป็นเรื่องยากซึ่งเป็นไปตามแนวปฏิบัติที่ดีและให้คำแนะนำที่จะช่วยให้คุณสร้างสคริปต์ที่มีประโยชน์ หลังจากที่man bash
บางส่วนของทรัพยากรที่สำคัญที่สุดคือเกร็กวิกิพีเดีย , แฮกเกอร์ทุบตีและหนังสือเล่มล่าสุดของสตีฟปาร์คเกอร์ในเชลล์สคริปต์ที่ส่วนใหญ่เน้นBash
และถูกตีพิมพ์โดย O'Reilly การแนะนำที่ดีนอกจากนี้ยังมีการดำเนินการโดยคู่มือทุบตีเริ่มต้นของ
มีเปลือกหอยหลายใช้ได้สำหรับอูบุนตูชอบbash
, zsh
, ksh
, และtcsh
csh
ดังนั้นเมื่อมีคนพูดว่าเชลล์เขากำลังพูดถึงหนึ่งในนั้น อย่างไรก็ตามเปลือกเหล่านั้นแตกต่างกันเล็กน้อย ดังนั้นเมื่อมีคนพูดถึงbash
สคริปต์เขาใช้เชลล์ แต่เมื่อมีคนพูดถึงเชลล์สคริปต์เขาไม่ได้ใช้งานbash
เลย แต่ตามbash
ที่ใช้กันทั่วไปในการเขียนสคริปต์สำหรับ Ubuntu เขามักจะเป็น ยิ่งไปกว่านั้นกระสุนที่แตกต่างกันมีลักษณะเหมือนกันในหลาย ๆ ด้านดังนั้นมันจึงไม่สำคัญ
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr 3 08:58 /bin/bash*
นี่แสดงให้เห็นว่า 'sh' เป็น symlink ของ 'dash' และ / bin / bash ซึ่งเป็นเชลล์แบบโต้ตอบเริ่มต้นบน Ubuntu เป็นไฟล์ปฏิบัติการที่มีขนาดใหญ่กว่า / bin / sh เกือบ 9 เท่า
แท้จริงแล้ว 'man sh' (1590 บรรทัด) และ 'man bash' (5459 บรรทัด) เปิดเผยว่า bash นั้นมีขนาดใหญ่มากของ 'sh' แบบดั้งเดิม
อ่านเพิ่มเติมได้ที่นี่:
เชลล์สคริปต์จะถูกกำหนดเป็นสคริปต์ที่เน้นพอร์ตแบบพกพาซึ่งสามารถเรียกใช้โดยเชลล์ระบบของระบบปฏิบัติการที่สอดคล้องกับ POSIX ไวยากรณ์จะเหมือนกันหรือคล้ายกันกับไวยากรณ์ภาษาเชลล์สคริปต์ที่กำหนดโดยมาตรฐาน POSIX นั่นเป็นมาตรฐานสำหรับระบบปฏิบัติการที่รองรับ POSIX ส่วนใหญ่เช่น Linux / Unix / * BSD เป็นต้น POSIX เป็นพื้นฐานที่พบบ่อยที่สุดสำหรับความเข้ากันได้กับระบบปฏิบัติการ
ระบบปฏิบัติการที่แตกต่างจากที่กล่าวมาใช้เปลือกที่แตกต่างกันสำหรับการใช้งานที่ไม่โต้ตอบ (เช่นการเรียกใช้สคริปต์ระบบหรือสคริปต์ที่ใช้#! /bin/sh
shebang) ซึ่งอยู่ข้างๆการใช้คำสั่ง POSIX และไวยากรณ์มีส่วนขยายของตัวเอง สำหรับเหตุผลด้านประสิทธิภาพ แต่พื้น POSIX ช่วยให้สามารถพกพาสคริปต์ในระดับสูงมากซึ่งออกแบบมาสำหรับระบบปฏิบัติการที่สอดคล้องกับ POSIX ที่แตกต่างกัน
ส่วนใหญ่ดังกล่าวข้างต้นระบบปฏิบัติการมีเปลือกโต้ตอบแยกต่างหากซึ่งมักจะเต็มแนะนำทุบตี Bash สอดคล้องกับ POSIX เป็นส่วนใหญ่ แต่ก็มีกลุ่มคำสั่งเพิ่มเติมจำนวนมากและรองรับไวยากรณ์ที่แตกต่างกัน การเริ่มต้น Bash ด้วยตัวเลือกบรรทัดคำสั่ง --posix หรือดำเนินการ 'set -o posix' ในขณะที่ Bash กำลังทำงานอยู่จะทำให้ Bash สอดคล้องกับมาตรฐาน POSIX อย่างใกล้ชิดมากขึ้นโดยการเปลี่ยนพฤติกรรมให้ตรงกับที่ระบุโดย POSIX ในพื้นที่ที่เริ่มต้น Bash แตกต่างโปรดดูที่: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
ต้องขอบคุณกฎที่เหมือนกันในการวางเอ็กซีคิ้วท์สำหรับเชลล์ (โดยปกติจะอยู่ในไดเรกทอรี '/ bin /') เราสามารถมีกฎที่เหมือนกันสำหรับการสร้างเชลล์สคริปต์โดยเฉพาะอย่างยิ่งเราชัดเจนว่าเส้นทางใดที่จะใส่นิพจน์ Shebang เชลล์ปฏิบัติการที่เหมาะสมเพื่อรันสคริปต์ ระบบไฟล์ Unix / Linux / * BSD ไม่รองรับส่วนขยายภายในดังนั้นส่วนขยายไฟล์ใช้เป็นคำแนะนำเพิ่มเติมเท่านั้นหรือเพื่อวัตถุประสงค์ในการจัดทำดัชนี
บน Debian / Ubuntu โดยเฉพาะbin/sh
เป็นชี้ symlink ไปbin/dash
ซึ่งเป็นปฏิบัติการของเปลือกประ นั่นทำให้เส้นประของระบบเปลือกซึ่งคาดว่าจะเร็วขึ้น 4x และมีขนาด ~ 1/10 กว่าทุบตีการทำงานมากขึ้น แหล่งที่มา: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash
Debian / Ubuntu ขั้วโต้ตอบเป็นค่าเริ่มต้นในขณะที่อื่น ๆ อีกมากมายระบบ Unix /bin/bash
เหมือนปฏิบัติการทุบตีซึ่งเส้นทางที่ยังเป็นชุด:
มาตรฐาน POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html
หากคำสั่งหรือตัวเลือกไม่ได้ถูกกำหนดโดย POSIX อย่าวางไว้ใน
#! /bin/sh
สคริปต์ตั้งแต่แรก
สำหรับการแปลงสคริปต์จาก bash เป็นรูปแบบ POSIX คุณอาจต้องการตรวจสอบข้อบกพร่องในเชลล์สคริปต์โดยอัตโนมัติหรือดูการเปลี่ยนแปลงในสคริปต์ทุบตีของคุณที่คุณควรทำเพื่อให้ POSIX ใช้งานร่วมกันได้: