ฉันกำลังทำแบบฝึกหัดเชลล์สคริปต์และพบโปรแกรมตัวอย่างต่อไปนี้:
#!/bin/sh
clear
echo "HELLO WORLD"
ทุกคนได้โปรดบอกฉันว่าความสำคัญของความคิดเห็น#!/bin/sh
ในตอนเริ่มต้นคืออะไร?
ฉันกำลังทำแบบฝึกหัดเชลล์สคริปต์และพบโปรแกรมตัวอย่างต่อไปนี้:
#!/bin/sh
clear
echo "HELLO WORLD"
ทุกคนได้โปรดบอกฉันว่าความสำคัญของความคิดเห็น#!/bin/sh
ในตอนเริ่มต้นคืออะไร?
คำตอบ:
มันเรียกว่าshebangและบอกผู้ปกครองว่าควรใช้ล่ามในการดำเนินการสคริปต์อย่างไร
เช่น
#!/usr/bin/perl <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.
มันใช้งานเป็นความคิดเห็นเพื่อให้ทุกสิ่งที่เข้ามาในบรรทัดนั้นจะไม่ "เกี่ยวข้อง" กับล่ามที่ระบุ เช่นภาษาสคริปต์ทั้งหมดมีแนวโน้มที่จะเข้าใจว่าบรรทัดที่ขึ้นต้นด้วย#
เป็นความคิดเห็นและจะไม่สนใจ!/usr/bin/whatever
ส่วนซึ่งอาจเป็นข้อผิดพลาดทางไวยากรณ์ในภาษานั้น ๆ
exec()
เรียกระบบบนไฟล์
เมื่อคุณพยายามเรียกใช้โปรแกรมในระบบปฏิบัติการยูนิกซ์ (หนึ่งชุดพร้อมชุดปฏิบัติการ) ระบบปฏิบัติการจะดูที่ไบต์แรก ๆ ของไฟล์ รูปแบบเหล่านี้เรียกว่า "หมายเลขมายากล" ซึ่งสามารถใช้ในการตัดสินใจรูปแบบของโปรแกรมและวิธีการดำเนินการ
#!
สอดคล้องกับหมายเลขเวทย์มนตร์ 0x2321 (ค้นหาในตาราง ascii) เมื่อระบบเห็นว่าจำนวนเวทย์มนตร์นั้นก็รู้ว่ามันกำลังจัดการกับสคริปต์ข้อความและอ่านจนกว่าจะถึงถัดไป\n
(มีขีด จำกัด แต่มันหนีฉันตู้เอทีเอ็ม) ต้องระบุล่าม (อาร์กิวเมนต์แรกหลัง shebang) มันจะเรียกล่าม
ไฟล์อื่น ๆ ยังมีหมายเลขมายากล ลองมองหาที่บิตแมป (.BMP) ไฟล์ผ่านและคุณจะเห็นตัวละครสองตัวแรกless
BM
หมายเลขเวทย์มนตร์นี้แสดงว่าไฟล์นั้นเป็นบิตแมป
หากไฟล์ที่สคริปต์นี้ใช้งานอยู่นั้นจะเรียกทำงานได้ hash-bang ( #!
) จะบอกระบบปฏิบัติการว่าตัวแปลใดที่จะใช้ในการเรียกใช้สคริปต์ ในกรณีนี้มันเป็น/bin/sh
เช่น
มีบทความเกี่ยวกับวิกิพีเดียสำหรับข้อมูลเพิ่มเติม
บรรทัดแรกบอกเชลล์ว่าถ้าคุณรันสคริปต์โดยตรง (./run.sh; ซึ่งตรงข้ามกับ / bin / sh run.sh) ควรใช้โปรแกรมนั้น (/ bin / sh ในกรณีนี้) เพื่อตีความมัน
นอกจากนี้คุณยังสามารถใช้เพื่อส่งผ่านอาร์กิวเมนต์ทั่วไป -e (ออกจากข้อผิดพลาด) หรือใช้โปรแกรมอื่น ๆ (/ bin / awk, / usr / bin / perl ฯลฯ )
#!/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
ps
และข้อความที่ตัดตอนมาเช่น#!/bin/sh
ควรจะจัดรูปแบบ