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


@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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.