¿Por qué lo necesitas?/ (dot-slash) antes del nombre del ejecutable o script para ejecutarlo en bash?


Al ejecutar 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 de esto? Pensé que . es un alias para la carpeta actual, y por lo tanto estas dos llamadas deberían ser equivalentes.

Tampoco entiendo por qué no necesito ./ al ejecutar aplicaciones, como:

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

(que se ejecuta sin ./)

Author: Charles Duffy, 2011-06-13

9 answers

Porque en Unix, normalmente, el directorio actual no está en $PATH.

Cuando escribe un comando, el shell busca una lista de directorios, como se especifica en 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 y entrar en el directorio de otro usuario y escriba sl en lugar de ls. Si el directorio actual está en PATH, el shell intentará ejecutar el sl programa en ese directorio (ya que no hay otro sl programa). Ese programa sl podría ser malicioso.

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

EDITAR

Esa parte sl fue solo un ejemplo. Los directorios en PATH son buscado secuencialmente y cuando se hace una coincidencia ese programa se ejecuta. Por lo tanto, dependiendo de cómo se vea PATH, escribir un comando normal puede o no ser suficiente para ejecutar el programa en el directorio actual.

 245
Author: cnicutar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-30 17:29:59

Cuando bash interpreta la línea de comandos, busca comandos en 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 . no suele estar en $PATH. Así que 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

Es no recomendado ya que tiene un problema de seguridad, además de que puede tener comportamientos extraños, ya que . varía en el directorio en el que se encuentra:)

Evitar:

PATH=.:$PATH

Como puede "enmascarar" algún comando estándar y abrir la puerta a la brecha de seguridad:)

Solo mis dos centavos.

 44
Author: neuro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-11 16:36:52

Su script, cuando esté en su directorio personal, no se encontrará cuando el shell mire la variable de entorno $PATH para encontrar su script.

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

 31
Author: mdm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-13 13:29:52

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

 4
Author: Mark Drago,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-13 13:32:14

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

 1
Author: Anomie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-13 13:32:27

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 ejecuta

./executable

A los que obtienes si corres

executable

(digamos que se encuentra 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.

Compruebe esto ejecutando

Que ejecutable

Y

whereis executable

Solucionó mis problemas...Tenía tres versiones del ejecutable, solo una de las cuales fue compilada correctamente para el entorno.

 1
Author: KR_Henninger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-20 14:18:50

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

 0
Author: Gayan Hewa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-13 13:31:38

Todo tiene una gran respuesta a la pregunta, y sí, esto solo es aplicable cuando se ejecuta en el directorio actual no a menos que incluya la ruta absoluta. Vea mis muestras a continuación.

También, el (dot-slash) tenía sentido para mí cuando tengo el comando en la carpeta secundaria tmp2 (/tmp/tmp2) y utiliza (double dot-slash).

MUESTRA:

[fifiip-172-31-17-12 tmp]$ ./StackO.sh

Hello Stack Overflow

[fifi@ip-172-31-17-12 tmp]$ /tmp/StackO.sh

Hello Stack Overflow

[fifi@ip-172-31-17-12 tmp]$ mkdir tmp2

[fifi@ip-172-31-17-12 tmp]$ cd tmp2/

[fifi@ip-172-31-17-12 tmp2]$ ../StackO.sh

Hello Stack Overflow
 -1
Author: FIFI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 13:58:09

Hay diferencia entre Current Directory y Working Directory puede que la encuentres fácilmente en google. Esa es la razón por la que su manage.py syncdb no se ejecuta como se esperaba.

Current Directory : Es el directorio desde donde se ejecuta tu shell o proceso padre.

you are right "."  is for current directory.

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

 -5
Author: Amandeep Jiddewar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-16 10:01:14