Jika Anda membuat file yang dapat dieksekusi dengan konten berikut, dan menjalankannya, itu akan menghapus dirinya sendiri.
Bagaimana cara kerjanya?
#!/bin/rm
shell-script
files
rm
executable
shebang
pengguna253751
sumber
sumber
rm
, ini tentang#!
. Pertanyaannya dapat diulang kembali menjadi bagaimana cara kerja skrip yang dapat dieksekusi dengan sebuah#!
karya.Jawaban:
Kernel menginterpretasikan baris yang dimulai dengan
#!
dan menggunakannya untuk menjalankan skrip, meneruskan nama skrip; jadi ini akhirnya berjalanyang menghapus skrip. (Sebagai Stéphane Chazelas menunjukkan ,
scriptname
di 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 diPATH
prepended, termasuk mungkin emptry string jika AndaPATH
mengandung 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
rm
skrip, bukanbash
skrip - 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.sumber
rm
akan 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./scriptname
dan jika Anda memanggilnyascriptname
, itu akan menjadi/path/to/scriptname
tempat/path/to
entri di$PATH
mana skrip itu ditemukan. Biasanya, hanya denganscriptname
jika Anda memiliki string kosong$PATH
dan Anda telah memanggil skrip sebagaiscriptname
danscriptname
ada di direktori saat ini.