ทำไมฉันถึงได้ผลลัพธ์ที่แตกต่างในกรณีของ sh และ bash?


8

ฉันมีสคริปต์ง่ายๆดังต่อไปนี้:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

เอาต์พุตในกรณีที่ฉันรันด้วยsh file.sh:

Bash version ...
{1..99..2}

เอาต์พุตในกรณีที่ฉันรันด้วยbash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

ฉันมีคำถามสองข้อ:

  1. ถ้าฉันเขียนบรรทัด shabang ที่ระบุเชลล์มันไม่ควรรันด้วยการทุบตีว่าฉันใช้sh file.shหรือbash file.shไม่?

  2. ฉันเข้าใจว่า$BASH_VERSIONsh ไม่รู้จัก แต่ปัญหาสำหรับลูปคืออะไร ทำไมไม่พิมพ์ตัวเลข?

คำตอบ:


16

sh, บอร์นเปลือกคือเก่า พฤติกรรมของมันจะถูกระบุโดยมาตรฐาน POSIX หากคุณต้องการพฤติกรรมใหม่คุณใช้bashเชลล์ Bourne Again ซึ่งได้รับคุณสมบัติใหม่ที่เพิ่มเข้ามาตลอดเวลา ในหลาย ๆ ระบบshเป็นเพียงbashและbashเปิดโหมดความเข้ากันได้เมื่อทำงานภายใต้ชื่อนั้น บน Ubuntu shคือdashเชลล์ Debian Almquist

การขยายรั้งเป็นคุณลักษณะที่ค่อนข้างใหม่และจะไม่พร้อมใช้งานใน bashes ที่เก่ากว่าเช่นกัน shแน่นอนมันไม่ควรจะอยู่ใน

บรรทัด shebang จะได้รับการเคารพก็ต่อเมื่อคุณเรียกใช้สคริปต์เป็นไฟล์เรียกทำงาน:

./myscript.sh

ฉันสามารถให้ shebang สคริปต์ใด ๆ และยังคงเปิดใน Python โดยการเรียกใช้:

python myscript.sh

ดูคำถามที่ยอดเยี่ยมเหล่านี้ใน Unix & Linux:


5

SH นั้นโง่ มันไม่สามารถทำอะไรได้เลย

มันรู้คำสั่งพื้นฐานที่สุดเท่านั้น มันไม่ได้ทำอะไรอย่างอื่น

ไม่สามารถเข้าใจ {1..99} เป็นค่าตัวเลขได้ มันเข้าใจว่ามันเป็นสตริง

SH / Dash ไม่ได้รับการพัฒนา มันมีไว้เพื่อเป็นพรอมต์ฉุกเฉินสำหรับสถานการณ์ DIRE (ในโหมดโต้ตอบมิฉะนั้นจะเป็นเรื่องดีสำหรับการเขียนสคริปต์)

แนะนำให้ใช้ Bash เพราะสามารถทำทุกอย่างที่ทำได้ด้วย SH รวมถึงคุณสมบัติใหม่ล่าสุดในการปรับแต่งและคุณสมบัติที่ทรงพลัง

ตามคำตอบของ # 1 #!จะมีการแยกวิเคราะห์เฉพาะเมื่อโปรแกรมถูกเรียกโดยตรง (เหมือนใน./program.sh)


6
" มีไว้เพื่อเป็นพรอมต์กรณีฉุกเฉินสำหรับสถานการณ์ DIRE " dashซึ่งตามที่คุณระบุshไว้ในอูบุนตูนั้นไม่ได้มีอยู่เป็นหลัก "เป็นพรอมต์ฉุกเฉินสำหรับสถานการณ์ DIRE" แต่แทนที่จะให้ระบบสามารถทำงานได้และเริ่มต้นอย่างรวดเร็ว . ด้วยวิธีdashนี้เหมาะอย่างยิ่งที่จะใช้ในระบบปฏิบัติการที่ทันสมัย ​​แต่สิ่งที่เหมาะอย่างยิ่งสำหรับการเป็นสคริปต์ระดับต่ำและรวดเร็วสำหรับการสร้างสคริปต์ - โดยเฉพาะอย่างยิ่งการเรียกใช้สคริปต์ระบบในขณะที่บูตระบบปฏิบัติการขนาดใหญ่ที่ซับซ้อนและทันสมัย ประสิทธิภาพค่าใช้จ่าย
Eliah Kagan

@EliahKagan คุณใช้ SH ในกรณีที่มีบางอย่างผิดปกติมาก
Kaz Wolfe

1
คุณใช้shสวยตลอดเวลาและโดยเฉพาะอย่างยิ่งรองเท้าบูท Ubuntu ส่วนใหญ่มีความสำคัญต่อการใช้งานสคริปต์อัตโนมัติและเป็นกรณีการใช้งานที่สำคัญมากใน Ubuntu (ถ้าคุณจะเอา/bin/sh symlink - เพื่อให้มีผลบังคับใช้จะมี "ไม่ SH" - สิ่งที่จะไปผิดมหันต์: อูบุนตูไม่สามารถบูตขึ้นเป็นรัฐที่สามารถใช้งานได้.)
Eliah Kagan

@EliahKagan คุณใช้ SH เป็นเทอร์มินัลที่คุณต้องการครั้งสุดท้ายเมื่อใด ฉันรู้ว่าคุณใช้สคริปต์นี้ แต่เมื่อไหร่ที่คุณจะใช้มันในโหมดโต้ตอบ?
Kaz Wolfe

2
เมื่อวานนี้เพื่อตรวจสอบว่าคำสั่งแบบพกพาเป็นอย่างไร แต่ประเด็นของคุณที่การใช้ dash แบบโต้ตอบนั้นหายากนั้นใช้ได้ (และต่อไปบริบทของการใช้งานแบบอินเตอร์แอคทีฟของฉันยังคงเป็นสคริปต์อยู่) .... แต่ "การใช้" ไม่ได้หมายถึง "การใช้แบบโต้ตอบ" และที่สำคัญกว่ากรณีการใช้ในคำถามนี้ไม่ใช่แบบโต้ตอบ!
Eliah Kagan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.