¿Por qué tengo que escribir './' antes de ejecutar un programa en el directorio actual?

86

Mientras ejecutaba un programa en C, a.out , usando la terminal de Ubuntu, ¿por qué siempre necesito escribir ./ antes de a.out , en lugar de escribir a.out ? ¿Hay solución para esto?

    
pregunta Prashant Chikhalkar 16.07.2013 - 13:58

10 respuestas

113

Cuando escribe el nombre de un programa como a.out , el sistema busca el archivo en su RUTA. En mi sistema, PATH está configurado para

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

El tuyo probablemente sea similar. Para verificar, ingresa echo $PATH en una terminal.

El sistema examina estos directorios en el orden indicado y, si no puede encontrarlo, produce un error command not found .

Anteponiendo el comando con ./ dice "olvídate de la RUTA, quiero que mires solo en el directorio actual".

Del mismo modo, puede indicarle al sistema que busque en otra ubicación específica anteponiendo el comando con una ruta relativa o absoluta, como por ejemplo:

../ significa en el directorio principal, por ejemplo, ../hello buscar hello en el directorio principal.

./Debug/hello : "busca hello en el subdirectorio Debug de mi directorio actual."

o /bin/ls : "buscar ls en el directorio /bin "

De forma predeterminada, el directorio actual no está en la ruta porque se considera un riesgo de seguridad. Ver ¿Por qué? no está en la ruta por defecto? en el Superusuario por qué.

Es posible agregar el directorio actual a su RUTA, pero por las razones dadas en la pregunta vinculada, no lo recomendaría.

    
respondido por el Warren Hill 16.07.2013 - 15:20
24

La razón de esto es simple.

Supongamos que tiene un comando con el mismo nombre que una aplicación en el directorio actual. Luego, ejecutar el comando en el shell invocaría su aplicación en su lugar del comando incorporado. Esto sería un problema de seguridad si nada más.

Al exigir que ./ se use al frente, el shell sabe que desea ejecutar la aplicación con el nombre de pila y no un comando integrado con ese nombre.

    
respondido por el Nathan Osman 16.12.2010 - 04:21
16

./ ejecuta archivos que no están en su $PATH , sino que ejecuta el archivo en el directorio actual (u otro a través de ./home/stefano/script.sh ). Ahora, PATH es una variable de entorno que contiene todos los lugares donde bash puede buscar programas ejecutables, sin tener la ruta completa (absoluta) hacia ellos.

Esta separación es necesaria para evitar ejecutar el archivo incorrecto. Es decir. si tiene un archivo llamado ls en su directorio de inicio, el hecho de que no esté en su PATH evitará que bash lo confunda con el ls real. La variable PATH también define el orden de búsqueda:

  • Cuando ejecuta un comando, o un programa intenta hacer un exec syscall (un método especial del Kernel, cómo se inician los programas), el sistema busca el archivo pasando por cada uno de los directorios en su PATH . Una vez que se ha encontrado el programa, incluso si está en varios directorios, se interrumpe la búsqueda y se ejecuta el primero encontrado.

Para ejecutar un archivo, deberá establecer el bit ejecutable en los permisos:

  • Como ya está en la línea de comandos, puede escribir chmod +x finename .

  • O puede establecer los permisos haciendo clic con el botón derecho en el archivo y seleccionando Propiedades :

Ahora puede copiar el archivo en cualquiera de los directorios en PATH, para ver cuáles están allí y están configurados para cada usuario, escriba echo $PATH .

stefano@3000-G530:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Si crea un archivo ejecutable, cat , y lo mueve a /usr/local/sbin , se ejecuta en lugar del cat apropiado, que reside en /bin . Puede averiguar dónde están sus archivos usando type cat y whereis cat .

    
respondido por el Stefano Palazzo 16.12.2010 - 04:18
11

¿Por qué necesita escribir ./ antes de ejecutar un programa?

En la terminal, cada vez que escriba el nombre de una aplicación, digamos gedit , la terminal buscará en algunos directorios (predefinidos) que contienen aplicaciones (los binarios de las aplicaciones). Los nombres de estos directorios están contenidos en una variable llamada PATH . Puede ver lo que hay en esta variable ejecutando echo $PATH . ¿Ves esos directorios separados por : ? Esos son los directorios en los que buscará la terminal, si escribe gedit , nautilus o a.out . Como puede ver, la ruta de su programa a.out no está allí. Cuando hagas ./a.out , le estarás diciendo al terminal "buscar en el directorio actual, y ejecutar a.out , y no buscar en PATH .

Solución 1

Si no quieres escribir ./ cada vez, necesitarás agregar el directorio de a.out en $PATH . En las siguientes instrucciones, supondré que la ruta a a.out es /path/to/programs/ , pero debe cambiarla a su ruta real.

  1. Simplemente agregue la siguiente línea al final del archivo ~/.pam_environment :

    PATH DEFAULT=${PATH}:/path/to/programs
    

    Fuente: Variables de entorno persistentes

  2. Cerrar sesión y volver a iniciar sesión. Ahora podrá ejecutar a.out sin ./ desde cualquier directorio.

Si tiene otros programas en otros directorios, puede agregarlos a la línea anterior. Sin embargo, aconsejaría tener un directorio llamado "myPrograms" por ejemplo, y poner todos sus programas debajo de él.

Solución 2

  

Nota: cambie userName a su nombre de usuario real de Ubuntu.

¿Qué sucede si tiene otros programas que desea ejecutar? ¿Y están todos en carpetas diferentes? Bueno, una solución "más organizada" sería crear una carpeta llamada bin en su directorio de inicio y agregar enlaces simbólicos (accesos directos) debajo de esa carpeta. He aquí cómo:

  1. mkdir /home/userName/bin

    • Esto creará la carpeta bin en su directorio de inicio.
  2. ln -s /path/to/programs/a.out /home/userName/bin

    • Esto creará un "enlace simbólico" (básicamente, un acceso directo) de tu programa a.out en bin .
  3. Cerrar sesión y volver a iniciar sesión. Ahora podrá ejecutar a.out sin ./ desde cualquier directorio.

Ahora, cada vez que tenga otro programa en otro lugar, digamos que el programa b.in en su Escritorio, todo lo que necesita hacer es: ln -s /home/userName/Desktop/b.in /home/userName/bin , y luego podrá ejecutarlo sin ./ como bien.

  

Nota: gracias a @ Comentario de Joe , cuando se realizan copias de seguridad, los enlaces simbólicos deben manejarse de manera especial. De forma predeterminada, rsync no los procesa en absoluto, por lo que cuando restaura, no están allí.

    
respondido por el Alaa Ali 16.07.2013 - 15:27
1

Como señaló George en su respuesta, esto le ayuda a saber que su ejecución de un archivo en el directorio de trabajo actual ( pwd ).

Recuerdo haberle hecho esta pregunta a mi senior hace mucho tiempo, dijo que debería agregar . a mi ruta para que cuando lo haga a.out se vea en el directorio actual y lo ejecute. En este caso, no tengo que hacer ./a.out .

Pero, personalmente, recomendaría no hacerlo. Nunca me pasó a mí, pero si estás en un directorio de red alienígena o algo así, y existe un archivo ejecutable malicioso llamado ls , entonces tener . en tu camino es una muy mala idea. No es que te encuentres con este problema muy a menudo, solo diciendo.

    
respondido por el Shrikant Sharat 16.12.2010 - 04:32
0

A './' tiene sentido cuando ejecuta un programa que es conocido para usted y específico, p. tu propio. Este programa debe estar presente en su directorio actual. Un './' no tiene sentido cuando ejecuta un comando estándar que está en algún lugar de $ PATH. Un comando "which command-to-run" le indica dónde se encuentra el comando-to-run en $ PATH.

    
respondido por el user7346 16.12.2010 - 12:06
0
$ gcc hello.c -o /path/to/someplace/hello

producirá un ejecutable en alguna ubicación. Si esa ubicación está en su camino, podrá ejecutar el archivo. Puede escribir esto si desea crear una etiqueta para la acción "compilar este código fuente usando gcc y colocar un ejecutable en alguna ubicación que esté en su ruta"

Le sugiero que cree un nuevo directorio llamado "testbin" o algo por el estilo y lo ponga en su ruta para mantener limpios sus directorios de ruta existentes.

    
respondido por el Jon Kiparsky 16.07.2013 - 20:35
0

./ elimina la búsqueda innecesaria de una ruta. ./ forzar para buscar solo en el directorio actual. Si no damos ./ , entonces buscará varias rutas establecidas en el sistema como /usr/bin , /usr/sbin/ , etc.

    
respondido por el user175959 17.07.2013 - 13:11
0

"./" significa que desea ejecutar un archivo en el directorio actual, es un atajo para escribir la ruta completa, por ejemplo:

[root@server ~]#/path/to/file/file.pl

es lo mismo que:

[root@server file]#./file.pl

en el ejemplo anterior, pasó por el directorio y sus supra directorios a la ubicación del archivo y usó "./" para ejecutar el archivo en el directorio actual.

el que está antes " [root @ server ~] # / path / to / file / file.pl " también ejecutará el archivo si usted es flojo para "cd" ir al archivo ubicación.

    
respondido por el Khaled Moustafa 25.04.2014 - 02:20
-4

Es muy simple y tiene muchos usos.

  1. Cuando se instalan varias versiones de la misma aplicación, estará disponible en una ruta diferente, pero se puede crear un enlace suave a su binario en /usr/bin . Por ejemplo, Python 2.7, Python 2.6 está instalado pero / usr / bin / python - & gt; python2.7 / usr / local / bin / python - & gt; python2.6

Si se encuentra en la ruta /usr/local/bin y ejecuta Python, siempre ejecutará Python 2.7. Especificando . tomará el ejecutable de la carpeta actual.

  1. . - siempre representa ejecutar desde el directorio actual. Y .. siempre significa ejecuta desde el directorio anterior.
respondido por el Ramjee Anna 17.07.2013 - 11:12

Lea otras preguntas en las etiquetas