Pourquoi le script suivant se supprime-t-il?

84

Si vous créez un fichier exécutable avec le contenu suivant et l'exécutez, il sera supprimé.
Comment cela marche-t-il?

#!/bin/rm
utilisateur253751
la source
4
Connexes
Trauma numérique
@ DigitalTrauma Heh, c'était ma première pensée quand j'ai vu cela.
chat
ce n'est pas à propos rm, c'est à propos de #!. La question pourrait être reformulée comme suit: comment fonctionne un script exécutable avec un script #!.
njzk2
1
Comment avez-vous réussi à tomber sur cela?
user1717828
1
C'est définitivement une question épique. Je regrette de ne pouvoir le voter qu'une seule fois.
Danila Kiver

Réponses:

112

Le noyau interprète la ligne commençant par #!et l'utilise pour exécuter le script en lui donnant son nom. donc ça finit par courir

/bin/rm scriptname

qui supprime le script. (Comme Stéphane Chazelas souligne , scriptnameici suffit pour trouver le script - si vous avez spécifié un chemin relatif ou absolu, qui est passé dans tel quel, sinon tout chemin a été trouvé dans PATHest préfixé, y compris éventuellement la chaîne de emptry si votre PATHcontient cela et le script est dans le répertoire courant. Vous pouvez jouer avec un script echo - #!/bin/echo- pour voir comment cela fonctionne.)

Comme l'a souligné Hobbs , cela signifie que votre script est en fait un rmscript, et non un bashscript - ce dernier commencerait par #!/bin/bash.

Voir Comment les programmes sont exécutés pour des détails sur son fonctionnement sous Linux; les commentaires sur cet article donnent des détails pour d'autres plates-formes. #!s’appelle un shebang, vous trouverez beaucoup d’informations en cherchant ce terme (merci à Aaron pour cette suggestion). Comme l'a souligné jlp , vous le trouverez également appelé "pound bang" ou "hash bang" ( #communément appelé "pound" - dans les pays qui n'utilisent pas £- ou "hash" et !"bang" ). Wikipedia a plus d'informations.

Stephen Kitt
la source
9
Autres noms pour "#!" vous entendrez peut-être "pound bang" et "hash bang". Voir en.wikipedia.org/wiki/Shebang_(Unix) pour plus de détails.
jlp
@jlp Pound Bang? Est-ce que c'est comme "bang for your buck"? Heh ...
chat
Ca me rappelle l'ol ' CrunchBang
Xen2050
1
Techniquement, l'argument à rmsera le chemin du script, c'est-à-dire le premier argument de l'appel système execve () effectué par le processus. En règle générale, si vous avez exécuté le script en tant que ./scriptname, ce sera ./scriptnameet si vous l'appelez en tant que scriptname, ce sera /path/to/scriptnameoù se /path/totrouve l'entrée dans $PATHlaquelle ce script a été trouvé. Généralement, cela ne se produit que scriptnamesi vous avez la chaîne vide $PATHet que vous avez appelé le script en tant que scriptnameet scriptnameest dans le répertoire en cours.
Stéphane Chazelas