Perché il seguente script si elimina da solo?


84

Se si crea un file eseguibile con i seguenti contenuti e lo si esegue, verrà eliminato automaticamente.
Come funziona?

#!/bin/rm


@DigitalTrauma Heh, è ​​stato il mio primo pensiero quando l'ho visto.
cat

non si tratta rm, si tratta di #!. La domanda potrebbe essere riformulata su come funziona uno script eseguibile con una #!funzione.
njzk2,

1
Come sei riuscito a inciampare su questo?
user1717828

1
Questa è sicuramente una domanda epica. Mi dispiace di poterlo votare una sola volta.
Danila Kiver,

Risposte:


112

Il kernel interpreta la riga che inizia con #!e la usa per eseguire lo script, passando il nome dello script; quindi questo finisce per funzionare

/bin/rm scriptname

che cancella la sceneggiatura. (Come sottolinea Stéphane Chazelas , qui è sufficiente trovare la sceneggiatura - se hai specificato un percorso relativo o assoluto, che è passato così com'è, altrimenti qualsiasi percorso trovato è anteposto, inclusa eventualmente la stringa emptry se la contiene e lo script si trova nella directory corrente. Puoi giocare con uno script echo - - per vedere come funziona.)scriptnamePATHPATH#!/bin/echo

Come sottolineato da Hobbs , questo significa che la tua sceneggiatura è in realtà una rmsceneggiatura, non una bashsceneggiatura - quest'ultima inizierà con #!/bin/bash.

Vedi Come vengono eseguiti i programmi per i dettagli su come funziona in Linux; i commenti su quell'articolo forniscono dettagli per altre piattaforme. #!si chiama shebang, troverai molte informazioni cercando quel termine (grazie ad Aaron per il suggerimento). Come ha sottolineato jlp , lo troverai anche chiamato "pound bang" o "hash bang" ( #è comunemente noto come "pound" - in paesi che non usano £- o "hash" e !come "bang" ). Wikipedia ha più informazioni.


9
Altri nomi per "#!" potresti sentire "pound bang" e "hash bang". Vedi en.wikipedia.org/wiki/Shebang_(Unix) per i dettagli.
jlp,

@jlp Pound bang? È come "bang for your buck"? Heh ...
cat

Mi ricorda il vecchio CrunchBang
Xen2050 del

1
Tecnicamente, l'argomento rmsarà il percorso dello script, ovvero il primo argomento della chiamata di sistema execve () effettuata dal processo. In genere, se hai eseguito lo script come ./scriptname, sarà ./scriptnamee se lo hai invocato come scriptname, sarà /path/to/scriptnamedove si /path/totrova la voce in $PATHcui è stato trovato lo script. In genere, lo farà solo scriptnamese hai la stringa vuota $PATHe hai invocato lo script come scriptnameed scriptnameè nella directory corrente.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.