เหตุใดสคริปต์ต่อไปนี้จึงลบตัวเอง


84

หากคุณสร้างไฟล์เรียกทำงานที่มีเนื้อหาต่อไปนี้และรันไฟล์ดังกล่าวจะลบตัวเอง
มันทำงานอย่างไร

#!/bin/rm


@ DigitalTrauma Heh นั่นเป็นความคิดแรกของฉันเมื่อฉันเห็นสิ่งนี้
แมว

มันไม่เกี่ยวกับมันเป็นเรื่องเกี่ยวกับrm #!คำถามอาจถูกนำมาใช้ใหม่เพื่อสคริปต์ที่สามารถเรียกใช้#!งานได้ทำงานอย่างไร
njzk2

1
คุณจัดการกับสิ่งนี้ได้อย่างไร
user1717828

1
นั่นเป็นคำถามที่ยิ่งใหญ่ ฉันเสียใจที่ฉันสามารถโหวตได้เพียงครั้งเดียว
Danila Kiver

คำตอบ:


112

เคอร์เนลตีความบรรทัดที่ขึ้นต้นด้วย#!และใช้เพื่อรันสคริปต์ผ่านในชื่อของสคริปต์ ดังนั้นสิ่งนี้จบลงด้วยการทำงาน

/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มีข้อมูลเพิ่มเติม


9
ชื่ออื่นสำหรับ "#!" คุณอาจได้ยินว่า "pound bang" และ "hash bang" ดูen.wikipedia.org/wiki/Shebang_(Unix)สำหรับรายละเอียด
jlp

@jlp Pound ปัง? เป็นเช่น "ปังสำหรับเจ้าชู้ของคุณ"? เฮ้ ...
แมว

เตือนให้ฉันนึกถึง ol ' CrunchBang
Xen2050

1
ในทางเทคนิคแล้วอาร์กิวเมนต์ที่rmจะเป็นเส้นทางไปยังสคริปต์นั่นคืออาร์กิวเมนต์แรกของการเรียกระบบ execve () ที่ดำเนินการโดยกระบวนการ โดยทั่วไปหากคุณเรียกใช้สคริปต์ในลักษณะ./scriptnameที่ว่าจะเป็น./scriptnameและหากคุณเรียกใช้งานในลักษณะscriptnameนั้นนั่นจะเป็น/path/to/scriptnameตำแหน่งที่/path/toมีรายการ$PATHที่พบสคริปต์นั้น โดยทั่วไปแล้วจะมีก็ต่อscriptnameเมื่อคุณมีสตริงว่าง$PATHและคุณเรียกใช้สคริปต์เป็นscriptnameและscriptnameอยู่ในไดเรกทอรีปัจจุบัน
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.