การทุบตีสคริปต์เหมือนกับเชลล์สคริปต์หรือไม่


58

ฉันใหม่สำหรับ Ubuntu ฉันได้ยินคนพูดว่า "shell scripting", "bash scripting"

ฉันสงสัยว่าพวกเขาเหมือนกันหรือไม่ หรือพวกเขาแตกต่างกันอย่างไร


มีคำตอบที่เป็นประโยชน์ได้ที่SO
Mr. Pei

คำตอบ:


55

Bash ( bash) เป็นหนึ่งในหลาย ๆ ที่มี (ยังใช้มากที่สุด) Unix shells Bash ย่อมาจาก " B ourne A gain SH ell" และเป็นการแทนที่ / ปรับปรุงเชลล์เป้าหมายเดิม ( sh)

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

แก้ไข: ที่จริงแล้วเชลล์สคริปต์เริ่มต้นใน Ubuntu เป็นเส้นประในขณะที่เชลล์แบบโต้ตอบเริ่มต้น (สิ่งที่คุณจะได้รับหากคุณดึงเทอร์มินัล) คือ Bash อย่างไรก็ตามทั้งสองคำนี้ยังคงใช้แทนกันได้เป็นส่วนใหญ่


1
กำหนด dash เป็นเชลล์สคริปต์เริ่มต้นอะไร
wjandrea

1
@wjandrea ความจริงที่ว่า/bin/shเป็น symlink ไป/bin/dashทำให้เริ่มต้นระบบเปลือก แต่ยังไม่ได้เริ่มต้นการเขียนสคริปต์/bin/shเปลือกคือไม่มีกฎที่เขียนอย่างที่คุณต้องใช้ เมื่อใช้อย่างใดอย่างหนึ่ง/bin/shนั้นเป็นเหตุผลหลักในการพกพาเมื่อคุณคาดว่าสคริปต์ของคุณจะใช้บนแพลตฟอร์มระบบปฏิบัติการ Unix ที่มีลักษณะคล้าย Unix ซึ่งส่วนใหญ่จะมี/bin/shเชลล์ Bourne-compliant POSIX-compliant
Sergiy Kolodyazhnyy

29

บทนำ

การเขียนสคริปต์และการเขียนสคริปต์ของเชลล์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เชลล์สคริปต์ยังสามารถเรียกว่าในบรรทัดคำสั่งอย่างใดอย่างหนึ่งหรือshbash

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

ทรัพยากรสำหรับการเขียนสคริปต์ Bash Shell

บางครั้งการค้นหาแหล่งข้อมูลที่เป็นประโยชน์ทางออนไลน์เป็นเรื่องยากซึ่งเป็นไปตามแนวปฏิบัติที่ดีและให้คำแนะนำที่จะช่วยให้คุณสร้างสคริปต์ที่มีประโยชน์ หลังจากที่man bashบางส่วนของทรัพยากรที่สำคัญที่สุดคือเกร็กวิกิพีเดีย , แฮกเกอร์ทุบตีและหนังสือเล่มล่าสุดของสตีฟปาร์คเกอร์ในเชลล์สคริปต์ที่ส่วนใหญ่เน้นBashและถูกตีพิมพ์โดย O'Reilly การแนะนำที่ดีนอกจากนี้ยังมีการดำเนินการโดยคู่มือทุบตีเริ่มต้นของ


2
คำตอบนี้ดีกว่าของฉันจริงๆ (คำตอบที่ยอมรับได้) ฉันเพิ่งมาเมื่อสัปดาห์ก่อนหน้านี้
Hilton Shumway

4

มีเปลือกหอยหลายใช้ได้สำหรับอูบุนตูชอบbash, zsh, ksh, และtcshcsh

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


2
$ 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' แบบดั้งเดิม

อ่านเพิ่มเติมได้ที่นี่:


2

เชลล์สคริปต์จะถูกกำหนดเป็นสคริปต์ที่เน้นพอร์ตแบบพกพาซึ่งสามารถเรียกใช้โดยเชลล์ระบบของระบบปฏิบัติการที่สอดคล้องกับ POSIX ไวยากรณ์จะเหมือนกันหรือคล้ายกันกับไวยากรณ์ภาษาเชลล์สคริปต์ที่กำหนดโดยมาตรฐาน POSIX นั่นเป็นมาตรฐานสำหรับระบบปฏิบัติการที่รองรับ POSIX ส่วนใหญ่เช่น Linux / Unix / * BSD เป็นต้น POSIX เป็นพื้นฐานที่พบบ่อยที่สุดสำหรับความเข้ากันได้กับระบบปฏิบัติการ

ระบบปฏิบัติการที่แตกต่างจากที่กล่าวมาใช้เปลือกที่แตกต่างกันสำหรับการใช้งานที่ไม่โต้ตอบ (เช่นการเรียกใช้สคริปต์ระบบหรือสคริปต์ที่ใช้#! /bin/shshebang) ซึ่งอยู่ข้างๆการใช้คำสั่ง 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

ตัวระบุShebangและพา ธ ที่เหมือนกันสำหรับเชลล์ที่ใช้งานได้บนระบบปฏิบัติการ Unix-like

ต้องขอบคุณกฎที่เหมือนกันในการวางเอ็กซีคิ้วท์สำหรับเชลล์ (โดยปกติจะอยู่ในไดเรกทอรี '/ 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 ใช้งานร่วมกันได้:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism


1
คำตอบที่ดีงาม +1 ยินดีต้อนรับสู่ AskUbuntu!
Sergiy Kolodyazhnyy

1
เกี่ยวกับDash as / bin / shบน Ubuntu มีบทความสำหรับบทความที่คุณอาจต้องการอ้างอิง และนอกจากนี้ยังมีaskubuntu.com/q/976485/295286
Sergiy Kolodyazhnyy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.