หากคุณสร้างไฟล์เรียกทำงานที่มีเนื้อหาต่อไปนี้และรันไฟล์ดังกล่าวจะลบตัวเอง
มันทำงานอย่างไร
#!/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อยู่ในไดเรกทอรีปัจจุบัน