Mengapa skrip berikut menghapusnya sendiri?

84

Jika Anda membuat file yang dapat dieksekusi dengan konten berikut, dan menjalankannya, itu akan menghapus dirinya sendiri.
Bagaimana cara kerjanya?

#!/bin/rm
pengguna253751
sumber
4
Terkait
Digital Trauma
@DigitalTrauma Heh, itu adalah pikiran pertama saya ketika saya melihat ini.
kucing
ini bukan tentang rm, ini tentang #!. Pertanyaannya dapat diulang kembali menjadi bagaimana cara kerja skrip yang dapat dieksekusi dengan sebuah #!karya.
njzk2
1
Bagaimana Anda bisa menemukan ini?
user1717828
1
Itu pasti pertanyaan epik. Saya menyesal bahwa saya dapat membenarkan itu hanya sekali.
Danila Kiver

Jawaban:

112

Kernel menginterpretasikan baris yang dimulai dengan #!dan menggunakannya untuk menjalankan skrip, meneruskan nama skrip; jadi ini akhirnya berjalan

/bin/rm scriptname

yang menghapus skrip. (Sebagai Stéphane Chazelas menunjukkan , scriptnamedi sini adalah cukup untuk menemukan script - jika Anda tentukan path relatif atau absolut, yang disahkan pada as-adalah, jika tidak jalan apa pun yang ditemukan di PATHprepended, termasuk mungkin emptry string jika Anda PATHmengandung itu dan skrip ada di direktori saat ini. Anda dapat bermain-main dengan skrip gema - #!/bin/echo- untuk melihat bagaimana ini bekerja.)

Seperti yang ditunjukkan oleh hobbs , ini berarti skrip Anda sebenarnya adalah rmskrip, bukan bashskrip - skrip akan dimulai dengan #!/bin/bash.

Lihat Bagaimana program dijalankan untuk detail tentang bagaimana ini bekerja di Linux; komentar pada artikel itu memberikan detail untuk platform lain. #!disebut shebang, Anda akan menemukan banyak informasi dengan mencari istilah itu (terima kasih kepada Aaron untuk sarannya). Seperti yang ditunjukkan jlp , Anda juga akan menemukannya disebut sebagai "pound bang" atau "hash bang" ( #umumnya dikenal sebagai "pound" - di negara-negara yang tidak menggunakan £- atau "hash", dan !sebagai "bang") ). Wikipedia memiliki lebih banyak informasi.

Stephen Kitt
sumber
9
Nama lain untuk "#!" Anda mungkin mendengar "pound bang" dan "hash bang". Lihat en.wikipedia.org/wiki/Shebang_(Unix) untuk detailnya.
jlp
@ jlp Pound bang? Apakah itu seperti "bang for your buck"? Heh ...
cat
Mengingatkan saya pada ol ' CrunchBang
Xen2050
1
Secara teknis, argumen untuk rmakan menjadi jalan menuju skrip, yaitu argumen pertama ke panggilan sistem execve () yang dibuat oleh proses. Biasanya, jika Anda menjalankan skrip sebagai ./scriptname, itu akan menjadi ./scriptnamedan jika Anda memanggilnya scriptname, itu akan menjadi /path/to/scriptnametempat /path/toentri di $PATHmana skrip itu ditemukan. Biasanya, hanya dengan scriptnamejika Anda memiliki string kosong $PATHdan Anda telah memanggil skrip sebagai scriptnamedan scriptnameada di direktori saat ini.
Stéphane Chazelas