¿Por qué necesita ./ (punto-barra) antes del ejecutable o del nombre del script para ejecutarlo en bash?

Cuando ejecuto scripts en bash, tengo que escribir ./ al principio:

 $ ./manage.py syncdb 

Si no lo hago, recibo un mensaje de error:

 $ manage.py syncdb -bash: manage.py: command not found 

¿Cuál es la razón para esto? Yo pensé es un alias para la carpeta actual, y por lo tanto estas dos llamadas deberían ser equivalentes.

Tampoco entiendo por qué no necesito ./ cuando ./ aplicaciones, como por ejemplo:

 user:/home/user$ cd /usr/bin user:/usr/bin$ git 

(que se ejecuta sin ./ )

Porque en Unix, por lo general, el directorio actual no está en $PATH .

Cuando escribe un comando, el shell busca una lista de directorios, según lo especificado por la variable PATH . El directorio actual no está en esa lista.

La razón para no tener el directorio actual en esa lista es la seguridad.

Digamos que eres root e ingresas al directorio de otro usuario y sl lugar de ls . Si el directorio actual está en PATH , el shell intentará ejecutar el progtwig sl en ese directorio (ya que no hay otro progtwig sl ). Ese progtwig sl puede ser malicioso.

Funciona con ./ porque POSIX especifica que un nombre de comando que contenga un / se utilizará como un nombre de archivo directamente, suprimiendo una búsqueda en $PATH . Podría haber utilizado la ruta completa para el mismo efecto exacto, pero ./ es más corto y más fácil de escribir.

EDITAR

Esa parte sl fue solo un ejemplo. Los directorios en PATH se buscan secuencialmente y cuando se realiza una coincidencia, ese progtwig se ejecuta. Entonces, dependiendo de cómo se ve PATH , escribir un comando normal puede o no ser suficiente para ejecutar el progtwig en el directorio actual.

Cuando bash interpreta la línea de comando, busca comandos en las ubicaciones descritas en la variable de entorno $PATH . Para verlo escriba:

 echo $PATH 

Tendrás algunos caminos separados por dos puntos. Como verá la ruta actual . por lo general no está en $PATH . Entonces Bash no puede encontrar su comando si está en el directorio actual. Puedes cambiarlo teniendo:

 PATH=$PATH:. 

Esta línea agrega el directorio actual en $PATH para que pueda hacer:

 manage.py syncdb 

No se recomienda ya que tiene un problema de seguridad, además de que puede tener comportamientos extraños, como . varía según el directorio en el que se encuentre 🙂

Evitar:

 PATH=.:$PATH 

Como puede “enmascarar” algunos comandos estándar y abrir la puerta a la brecha de seguridad 🙂

Solo mis dos centavos.

Su secuencia de comandos, cuando esté en su directorio de inicio, no se encontrará cuando el shell vea la $PATH entorno $PATH para encontrar su secuencia de comandos.

El ./ dice ‘buscar en el directorio actual de mi script en lugar de mirar todos los directorios especificados en $PATH ‘.

Cuando incluye el ‘.’ esencialmente estás dando la “ruta completa” al script bash ejecutable, por lo que tu shell no necesita verificar tu variable PATH. Sin el ‘.’ su shell buscará en su variable PATH (que puede ver ejecutando echo $PATH para ver si el comando que escribió vive en alguna de las carpetas de su RUTA. Si no lo hace (como es el caso de manage.py) dice que no puede encontrar el archivo. Se considera una mala práctica incluir el directorio actual en su RUTA, que se explica razonablemente bien aquí: http://www.faqs.org/faqs/unix-faq/faq/part2 /section-13.html

En * nix, a diferencia de Windows, el directorio actual no suele estar en su variable $PATH . Por lo tanto, el directorio actual no se busca al ejecutar comandos. No necesita ./ para ejecutar aplicaciones porque estas aplicaciones están en su $ PATH; lo más probable es que estén en /bin o /usr/bin .

Esta pregunta ya tiene algunas respuestas impresionantes, pero quería agregar que, si su ejecutable está en la RUTA, y obtiene salidas muy diferentes cuando se ejecuta

 ./executable 

a los que obtienes si corres

 executable 

(supongamos que se topa con mensajes de error con uno y no con el otro), entonces el problema podría ser que tiene dos versiones diferentes del ejecutable en su máquina: una en la ruta y la otra no.

Verifica esto ejecutando

qué ejecutable

y

 whereis executable 

Solucionó mis problemas … Tenía tres versiones del ejecutable, solo una comstackda correctamente para el entorno.

Cuando el script no está en la ruta, se requiere para hacerlo. Para obtener más información, lea http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html

Existe una diferencia entre el Current Directory y el Current Directory Working Directory que puede encontrar en google fácilmente. Esa es la razón por la cual su manage.py syncdb no se ejecutó como se esperaba.

Directorio actual : es el directorio desde donde se ejecuta su shell o proceso primario.

 you are right "." is for current directory. 

En el sistema basado en UNIX, si tiene su archivo en /data/myfile.out , está atravesando su archivo a través de nombres de componente que están separados por forward slash "/" por lo que si "." es su directorio actual, entonces si desea acceder (ejecutar en su caso) el archivo que está dentro de su directorio actual, tendrá que decir ./myexecutableFile.o . Si tuviera su archivo ejecutable en otra carpeta de su directorio actual, entonces haría algo como esto ./myFiles/myexecutableFile.o . Espero que tengas lo que bash explicar.