Si crea un archivo ejecutable con el siguiente contenido y lo ejecuta, se eliminará solo.
¿Como funciona esto?
#!/bin/rm
rm
, se trata de la #!
. La pregunta podría reformularse a cómo funciona cualquier script ejecutable con un #!
.
Si crea un archivo ejecutable con el siguiente contenido y lo ejecuta, se eliminará solo.
¿Como funciona esto?
#!/bin/rm
rm
, se trata de la #!
. La pregunta podría reformularse a cómo funciona cualquier script ejecutable con un #!
.
Respuestas:
El núcleo interpreta la línea que comienza #!
y la utiliza para ejecutar el script, pasando el nombre del script; así que esto termina corriendo
/bin/rm scriptname
que elimina el guión. (Como señala Stéphane Chazelas , aquí es suficiente para encontrar el script: si especificó una ruta relativa o absoluta, se pasa tal cual, de lo contrario, cualquier ruta que se encuentre está antepuesta, incluida posiblemente la cadena de entrada si contiene eso y el script está en el directorio actual. Puede jugar con un script de eco - para ver cómo funciona.scriptname
PATH
PATH
#!/bin/echo
Como señaló Hobbs , esto significa que su script es en realidad un rm
script, no un bash
script, este último comenzaría con #!/bin/bash
.
Consulte Cómo se ejecutan los programas para obtener detalles sobre cómo funciona esto en Linux; Los comentarios sobre ese artículo dan detalles para otras plataformas. #!
se llama shebang, encontrará mucha información buscando ese término (gracias a Aaron por la sugerencia). Como jlp señaló, también lo encontrará como "libra bang" o "hash bang" ( #
comúnmente conocido como "libra" - en países que no usan £
- o "hash", y !
como "bang" ) Wikipedia tiene más información.
rm
será la ruta al script, ese es el primer argumento para la llamada al sistema execve () realizada por el proceso. Por lo general, si ejecutó el script como ./scriptname
, eso será ./scriptname
y si lo invocó como scriptname
, /path/to/scriptname
allí /path/to
será la entrada en la $PATH
que se encontró ese script. Por lo general, solo lo hará scriptname
si tiene la cadena vacía $PATH
y ha invocado el script como scriptname
y scriptname
está en el directorio actual.