¿Por qué se necesita ./ para ejecutar un archivo ejecutable?

9

Estoy usando ubuntu y noto que muchos de mis scripts ejecutables no se ejecutarán a menos que preceda al tema ./.

Por ejemplo, si tengo una secuencia de comandos perl: /home/me/script.ply actualmente estoy dentro /home/me, escribir script.plno lo hará, pero lo ./script.plhará.

¿Porqué es eso?

David B
fuente
@David B runnable file => executable file:?
Lazer

Respuestas:

13

Para ejecutar una secuencia de comandos, debe escribir la ruta completa a la secuencia de comandos a menos que la secuencia de comandos esté presente en uno de los directorios enumerados en su $PATHvariable de entorno. Generalmente (y de manera predeterminada) .(el directorio actual) no está en su $PATH, por lo que debe escribir ./scriptpara ejecutarlo.

mipadi
fuente
21

Porque el directorio actual no está en su camino. Esta es una característica de seguridad. Si estuviera en su camino, alguien podría soltar una copia maliciosa de un comando común, y cuando esté en ese directorio en lugar de ejecutar el sudo real, por ejemplo, ejecutaría el falso. Eso sería algo malo.

Matt Greer
fuente
3
Esto es algo engañoso. Mientras .estuvieran después /usr/bin/, no reemplazaría lo real sudo. Es para asegurarse de que no agrega accidentalmente programas a su ruta, pero no se trata principalmente de reemplazar los existentes.
Matthew Flaschen
En lugar de sudo, usaría lsy rm. Mucho más probable que se llame.
Aaron Digulla
@aaron: claro, pero lsno pedirá su contraseña y si el usuario puede usar sudola contraseña es interesante ...;)
Laurent
1
@Matthew. Sí, aún es un riesgo difícil de explotar pero de seguridad real. Digamos que puse un script slque hace cosas malas, luego invoca ls, luego se elimina. No puede anular las herramientas del sistema, pero puede 'typosquat'
Rich Homolka
@laurent: Lo que tenía en mente era: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". No es necesario saber la contraseña.
Aaron Digulla
4
echo $PATH

Debe tener el directorio actual (un solo punto) en su ruta para que esto funcione.

Puede agregarlo a su ruta si lo desea con los siguientes comandos.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


fuente
3

el shell busca ejecutables en la ruta y, de manera predeterminada, ./no está en la ruta.

Emyr
fuente