operaciones - ¿Por qué necesita./(punto-barra) antes del ejecutable o el nombre del script para ejecutarlo en bash?
scripts bash ejemplos (9)
Al ejecutar scripts en bash, tengo que escribir ./
al principio:
$ ./manage.py syncdb
Si no lo hago, me aparece un mensaje de error:
$ manage.py syncdb
-bash: manage.py: command not found
¿Cuál es la razón para esto? Pensé es un alias para la carpeta actual y, por lo tanto, estas dos llamadas deben ser equivalentes.
Tampoco entiendo por qué no necesito ./
al ejecutar aplicaciones, como:
user:/home/user$ cd /usr/bin
user:/usr/bin$ git
(que corre sin ./
)
Cuando bash interpreta la línea de comandos, busca los comandos en las ubicaciones descritas en la variable de entorno $PATH
. Para verlo escribe:
echo $PATH
Tendrás algunos caminos separados por dos puntos. Como verás el camino actual .
por lo general no está 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
No se recomienda ya que tiene un problema de seguridad, además puede tener comportamientos extraños, como .
varía según el directorio en el que se encuentre :)
Evitar:
PATH=.:$PATH
Como puede "enmascarar" algún comando estándar y abrir la puerta a la brecha de seguridad :)
Sólo mis dos centavos.
Cuando incluyes el ''.'' esencialmente le está dando la "ruta completa" al script bash ejecutable, por lo que su shell no necesita verificar su variable PATH. Sin el ''.'' su shell se verá en su variable PATH (que puede ver ejecutando echo $PATH
para ver si el comando que escribió está en alguna de las carpetas de su 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, lo cual se explica razonablemente bien aquí: http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html
Cuando la secuencia de comandos no está en la ruta, se requiere que lo haga. Para obtener más información, lea http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html
En * nix, a diferencia de Windows, el directorio actual generalmente no está en su variable $PATH
. Por lo tanto, no se busca en el directorio actual 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 asombrosas, pero quería agregar eso, si su ejecutable está en la RUTA, y obtiene resultados muy diferentes cuando ejecuta
./executable
a los que obtienes si corres
executable
(Digamos que te encuentras con mensajes de error con uno y no con el otro), entonces el problema podría ser que tienes dos versiones diferentes del ejecutable en tu máquina: una en la ruta y otra no.
Comprueba esto ejecutando
cual ejecutable
y
whereis executable
Solucioné mis problemas ... Tenía tres versiones del ejecutable, de las cuales solo una se compiló correctamente para el entorno.
Hay una diferencia entre el Current Directory
y el Current Directory
Working Directory
: puede encontrarlo fácilmente en google
. Esa es la razón por la que tu manage.py syncdb
no se ejecuta como se esperaba.
Directorio actual : es el directorio desde donde se ejecuta su shell o proceso padre.
you are right "." is for current directory.
En el sistema basado en UNIX, si tiene su archivo en /data/myfile.out
entonces está atravesando su archivo a través de los nombres de los componentes que están separados por forward slash "/"
y 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 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 estoy tratando de explicar.
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 y entras en el directorio de otro usuario y sl
lugar de ls
. Si el directorio actual está en PATH
, el shell intentará ejecutar el programa sl
en ese directorio (ya que no hay otro programa sl
). 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ía haber usado la ruta completa para el mismo efecto, 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 hace una coincidencia, se ejecuta el programa. Entonces, dependiendo de cómo se vea PATH
, escribir un comando normal puede o no ser suficiente para ejecutar el programa en el directorio actual.
Su secuencia de comandos, cuando se encuentre en su directorio de inicio, no se encontrará cuando la 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
''.
Todos tienen una gran respuesta a la pregunta, y sí, esto solo es aplicable cuando se ejecuta en el directorio actual, a menos que incluya la ruta absoluta. Ver mis muestras a continuación.
Además, la (barra de puntos) tenía sentido para mí cuando tengo el comando en la carpeta secundaria tmp2 (/ tmp / tmp2) y utiliza (doble barra de puntos).
MUESTRA:
[fifiip-172-31-17-12 tmp]$ ./StackO.sh
Hello
[fifi@ip-172-31-17-12 tmp]$ /tmp/StackO.sh
Hello
[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