¿Por qué usamos "./" para ejecutar un archivo?

84

¿Por qué usamos ./filenamepara ejecutar un archivo en Linux?

¿Por qué no simplemente ingresarlo como otros comandos gcc, lsetc.?

Renjith G
fuente
¿No se escribiría mejor la primera línea como "¿Por qué usamos ./command_namepara ejecutar un comando en Linux?"

Respuestas:

78

En Linux, UNIX y sistemas operativos relacionados, .denota el directorio actual. Como desea ejecutar un archivo en su directorio actual y ese directorio no está en el suyo $PATH, necesita el ./bit para indicarle al shell dónde está el ejecutable. Entonces, ./foosignifica ejecutar el ejecutable llamado fooque está en este directorio.

Puede usar typeu whichobtener la ruta completa de cualquier comando que se encuentre en su $PATH.

badp
fuente
55
Es muy común ejecutar programas en el directorio actual. ¿Por qué el shell no busca allí también? Primero busca en., Luego en $ PATH.
Michael
también hay aliaseses que pueden interferir, no solo $PATH.
user2485710
18
@Michael seguridad y cordura: si buscó .primero, entonces sería un problema de seguridad, usted u otra persona podría reemplazar, lspor ejemplo (un simple virus / trojen: haga un archivo zip con un ejecutable nombrado lsen él, ya que alguien está buscando , ejecutan este ejecutable, eso ...). Si buscó en .último lugar, puede pasar mucho tiempo volviéndose loco sin saber por qué su programa no funciona (por ejemplo, si realiza un programa llamado prueba, en lugar de ejecutar su programa, ejecuta el programa de prueba del sistema. El cual no produce resultados).
ctrl-alt-delor
También garantiza que si la aplicación o el script aparecen varias veces en su ruta, está ejecutando la versión que pretende ejecutar (la que está aquí en su directorio ".").
Jim2B
Puede ejecutar export PATH="$PATH:."para ejecutar el comando en el directorio actual si no se encuentra en otra parte de la RUTA, puede agregar esto en su archivo .bashrc
jcubic
99

La respuesta literal es como han dado otros: porque el directorio actual no está en su $PATH.

Pero por que? En resumen, es por seguridad. Si está buscando en el directorio de inicio de otra persona (o / tmp), y escribe just gcco ls, quiere saber que está ejecutando el verdadero, no una versión maliciosa que su amigo bromista ha escrito y que borra todos sus archivos. Otro ejemplo sería testo [, que podría anular esos comandos en los scripts de shell, si su shell no los tiene incorporados.

Tener .como última entrada en tu camino es un poco más seguro, pero hay otros ataques que hacen uso de eso. Una fácil es explotar errores tipográficos comunes, como slo ls-l. O bien, busque un comando común que no esté instalado en este sistema vim, por ejemplo, ya que los administradores de sistemas tienen una probabilidad superior a la media para escribir eso.

mattdm
fuente
55
Un ejemplo práctico de alguien que se mordió por esto: unix.stackexchange.com/questions/7767
mattdm
Solo tiene rutas absolutas en la PATHvariable de entorno.
Ed Heal
45

Si quiere decir, ¿por qué necesita ./ al principio? Eso es porque (a diferencia de Windows), el directorio actual no es parte de su ruta de forma predeterminada. Si tu corres:

$ ls

su shell busca lsen los directorios en su variable de entorno PATH ( echo $PATHpara verlo) y ejecuta el primer ejecutable llamado lsque encuentra. Si escribes:

$ a.out

el shell hará lo mismo, pero probablemente no encontrará un ejecutable llamado a.out. Debe decirle al shell dónde está a.out: está en el directorio actual (.) Y luego está la ruta ./a.out.

Si se pregunta por qué se llama "a.out", ese es solo el nombre de archivo de salida predeterminado para gcc. Puede cambiarlo con la línea de comando -o arg. Por ejemplo:

$ gcc test.c -o test
$ ./test
Simon Whitaker
fuente
Gracias. Mi duda es por qué necesita ./ al principio ... Obtuve el uso de "." (para apuntar el directorio actual) pero ¿por qué "/" después de eso?
Renjith G
8
/ es el separador de ruta en Linux, por lo que lo usa para separar el directorio (.) del nombre de archivo (a.out). Sin él, tiene .a.out, que es un nombre de archivo válido por derecho propio. (Intenta touch .a.out; ls -lAver esto.)
Simon Whitaker
55
así es como se especifica la ruta en Unix, <dir>/<file>por lo que básicamente está diciendo ejecutar un archivo en el directorio actual, que se indica por./test
Rohan Monga
Red Hat Linux versión 9 (Shrike) Kernel 2.4.20-8 en un i686 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA total 3 -rw-rw-r-- 1 renjithg renjithg 0 30 de noviembre 13 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 30 de noviembre 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 24 de agosto de 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G
3
Red Hat Linux 9? ¡Hora de actualizar!
mattdm
4

Puede intentar agregar :.a su variable $ PATH.

Pruebe ALT + F2 y escriba: gksudo gedit /etc/environmentsi está ejecutando Linux / GTK (esto es lo que tiene si usa Ubuntu).

SIN EMBARGO, le recomiendo que NO haga eso. Es malo, malo, malo y malo.

Sabes, ese tipo de cosas funcionan así desde 1970. Hay una razón por la cual el directorio actual no está incluido en $ PATH.

. es el directorio actual

.somethingsería un archivo oculto (escriba "ALT +" para que aparezcan en Nautilus o intente " ls -la".

./someProgram.sh es lo que escribe para ejecutar un ejecutable someProgram.sh en el directorio actual.

.somethingElse significaría que tiene un ejecutable oculto en el directorio actual, lo cual es una mala idea.

tiktak
fuente