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
shell-script
files
rm
executable
shebang
utilisateur253751
la source
la source
rm
, c'est à propos de#!
. La question pourrait être reformulée comme suit: comment fonctionne un script exécutable avec un script#!
.Réponses:
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 courirqui supprime le script. (Comme Stéphane Chazelas souligne ,
scriptname
ici 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é dansPATH
est préfixé, y compris éventuellement la chaîne de emptry si votrePATH
contient 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
rm
script, et non unbash
script - 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.la source
rm
sera 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./scriptname
et si vous l'appelez en tant quescriptname
, ce sera/path/to/scriptname
où se/path/to
trouve l'entrée dans$PATH
laquelle ce script a été trouvé. Généralement, cela ne se produit quescriptname
si vous avez la chaîne vide$PATH
et que vous avez appelé le script en tant quescriptname
etscriptname
est dans le répertoire en cours.