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


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.