บรรทัด“ #! / bin / sh” หมายถึงอะไรในเชลล์สคริปต์ UNIX


142

ฉันกำลังทำแบบฝึกหัดเชลล์สคริปต์และพบโปรแกรมตัวอย่างต่อไปนี้:

#!/bin/sh
clear
echo "HELLO WORLD"

ทุกคนได้โปรดบอกฉันว่าความสำคัญของความคิดเห็น#!/bin/shในตอนเริ่มต้นคืออะไร?



2
คำอธิบายที่ดีเกี่ยวกับ askubuntu: askubuntu.com/questions/141928/ …
fkoessler


คำตอบ:


143

มันเรียกว่าshebangและบอกผู้ปกครองว่าควรใช้ล่ามในการดำเนินการสคริปต์อย่างไร

เช่น

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

มันใช้งานเป็นความคิดเห็นเพื่อให้ทุกสิ่งที่เข้ามาในบรรทัดนั้นจะไม่ "เกี่ยวข้อง" กับล่ามที่ระบุ เช่นภาษาสคริปต์ทั้งหมดมีแนวโน้มที่จะเข้าใจว่าบรรทัดที่ขึ้นต้นด้วย#เป็นความคิดเห็นและจะไม่สนใจ!/usr/bin/whateverส่วนซึ่งอาจเป็นข้อผิดพลาดทางไวยากรณ์ในภาษานั้น ๆ


6
โดยปกติจะเป็นเคอร์เนลไม่ใช่เชลล์ซึ่งประมวลผลสิ่งนี้ เชลล์เพียงเรียกใช้การexec()เรียกระบบบนไฟล์
tripleee

47

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

#!สอดคล้องกับหมายเลขเวทย์มนตร์ 0x2321 (ค้นหาในตาราง ascii) เมื่อระบบเห็นว่าจำนวนเวทย์มนตร์นั้นก็รู้ว่ามันกำลังจัดการกับสคริปต์ข้อความและอ่านจนกว่าจะถึงถัดไป\n(มีขีด จำกัด แต่มันหนีฉันตู้เอทีเอ็ม) ต้องระบุล่าม (อาร์กิวเมนต์แรกหลัง shebang) มันจะเรียกล่าม

ไฟล์อื่น ๆ ยังมีหมายเลขมายากล ลองมองหาที่บิตแมป (.BMP) ไฟล์ผ่านและคุณจะเห็นตัวละครสองตัวแรกless BMหมายเลขเวทย์มนตร์นี้แสดงว่าไฟล์นั้นเป็นบิตแมป


10

หากไฟล์ที่สคริปต์นี้ใช้งานอยู่นั้นจะเรียกทำงานได้ hash-bang ( #!) จะบอกระบบปฏิบัติการว่าตัวแปลใดที่จะใช้ในการเรียกใช้สคริปต์ ในกรณีนี้มันเป็น/bin/shเช่น

มีบทความเกี่ยวกับวิกิพีเดียสำหรับข้อมูลเพิ่มเติม


5

บรรทัดแรกบอกเชลล์ว่าถ้าคุณรันสคริปต์โดยตรง (./run.sh; ซึ่งตรงข้ามกับ / bin / sh run.sh) ควรใช้โปรแกรมนั้น (/ bin / sh ในกรณีนี้) เพื่อตีความมัน

นอกจากนี้คุณยังสามารถใช้เพื่อส่งผ่านอาร์กิวเมนต์ทั่วไป -e (ออกจากข้อผิดพลาด) หรือใช้โปรแกรมอื่น ๆ (/ bin / awk, / usr / bin / perl ฯลฯ )


-4

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

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo

1
Stack Overflow ไม่ใช่ Twitter โปรดสละเวลาสะกดคำต่างๆเช่น "u" และ "1st" คุณกำลังช่วยเขียนหนังสืออ้างอิงเพื่อให้ไวยากรณ์และการสะกดคำที่เหมาะสมมีความสำคัญ ยังให้ความสนใจกับการจัดรูปแบบที่เหมาะสม คำสั่งที่จะออกมาจากบรรทัดคำสั่งเช่นpsและข้อความที่ตัดตอนมาเช่น#!/bin/shควรจะจัดรูปแบบ
คนดีบุก

ฉันพยายามทำความสะอาดภาษาอังกฤษที่นี่ แต่ฉันก็ยังไม่แน่ใจว่ามันหมายถึงอะไร ฉันเดาคำตอบพยายามบอกว่าคำสั่งในสคริปต์จะถูกดำเนินการเป็นคำสั่งที่แตกต่างกันและการเพิ่ม Shebang จะแสดงสคริปต์เป็นคำสั่งเดียวในรายการกระบวนการ สิ่งนี้ไม่เป็นความจริง
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.