หากคุณสร้างไฟล์เรียกทำงานที่มีเนื้อหาต่อไปนี้และรันไฟล์ดังกล่าวจะลบตัวเอง
มันทำงานอย่างไร
#!/bin/rm
rm
#!
คำถามอาจถูกนำมาใช้ใหม่เพื่อสคริปต์ที่สามารถเรียกใช้#!
งานได้ทำงานอย่างไร
หากคุณสร้างไฟล์เรียกทำงานที่มีเนื้อหาต่อไปนี้และรันไฟล์ดังกล่าวจะลบตัวเอง
มันทำงานอย่างไร
#!/bin/rm
rm
#!
คำถามอาจถูกนำมาใช้ใหม่เพื่อสคริปต์ที่สามารถเรียกใช้#!
งานได้ทำงานอย่างไร
คำตอบ:
เคอร์เนลตีความบรรทัดที่ขึ้นต้นด้วย#!
และใช้เพื่อรันสคริปต์ผ่านในชื่อของสคริปต์ ดังนั้นสิ่งนี้จบลงด้วยการทำงาน
/bin/rm scriptname
ซึ่งจะลบสคริปต์ ( ณStéphane Chazelas ชี้ให้เห็น , scriptname
นี่ก็เพียงพอที่จะหาสคริปต์ - ถ้าคุณระบุเส้นทางญาติหรือแน่นอนที่ผ่านตามที่เป็นมิฉะนั้นสิ่งที่เส้นทางที่พบในPATH
จะใช้ได้รวมทั้งอาจจะเป็นสตริง emptry ถ้าคุณPATH
มีที่และ สคริปต์อยู่ในไดเรกทอรีปัจจุบันคุณสามารถเล่นกับ echo script #!/bin/echo
- เพื่อดูว่ามันทำงานอย่างไร)
ในฐานะที่เป็นฮอบส์ชี้ให้เห็นนี้หมายถึงสคริปต์ของคุณเป็นจริงrm
สคริปต์ไม่ได้เป็นbash
สคริปต์ - #!/bin/bash
หลังจะเริ่มต้นด้วย
ดูวิธีการที่โปรแกรมได้รับการเรียกใช้สำหรับรายละเอียดของวิธีการทำงานนี้ในลินุกซ์; ความคิดเห็นในบทความนั้นให้รายละเอียดสำหรับแพลตฟอร์มอื่น ๆ #!
เรียกว่า Shebang คุณจะพบข้อมูลมากมายโดยการค้นหาคำนั้น (ขอบคุณAaronสำหรับคำแนะนำ) ดังที่jlpชี้ให้เห็นคุณจะพบว่ามันเรียกว่า "pound bang" หรือ "hash bang" ( #
หรือที่รู้จักกันทั่วไปว่า "pound" - ในประเทศที่ไม่ได้ใช้£
- หรือ "hash" และ!
"bang" ) Wikipediaมีข้อมูลเพิ่มเติม
rm
จะเป็นเส้นทางไปยังสคริปต์นั่นคืออาร์กิวเมนต์แรกของการเรียกระบบ execve () ที่ดำเนินการโดยกระบวนการ โดยทั่วไปหากคุณเรียกใช้สคริปต์ในลักษณะ./scriptname
ที่ว่าจะเป็น./scriptname
และหากคุณเรียกใช้งานในลักษณะscriptname
นั้นนั่นจะเป็น/path/to/scriptname
ตำแหน่งที่/path/to
มีรายการ$PATH
ที่พบสคริปต์นั้น โดยทั่วไปแล้วจะมีก็ต่อscriptname
เมื่อคุณมีสตริงว่าง$PATH
และคุณเรียกใช้สคริปต์เป็นscriptname
และscriptname
อยู่ในไดเรกทอรีปัจจุบัน