¿Por qué tengo que escribir "./" siempre antes de un ejecutable para ejecutarlo en Linux?

8

Cuando compilo egxc por:

GCC x.c -o x

Para ejecutar el resultado tengo que escribir:

./x

Y solo escribiendo:

x

Falla con este mensaje:

x: comando no encontrado

¡Esto significa que Linux no lo busca en el directorio actual! ¿Hay (estoy seguro de que hay) algún problema razonable detrás de este comportamiento?

Yasser Zamani
fuente
Porque son las reglas.
Daniel R Hicks
@DanH: Entonces explique "las reglas" por favor.
Torben Gundtofte-Bruun

Respuestas:

13

Porque de forma predeterminada, el directorio de trabajo actual no está en la PATHvariable.

Esta es una medida de seguridad / conveniencia. Si tiene archivos binarios / scripts llamados cd, por ejemplo , lsetc. en su directorio de trabajo actual, sería muy molesto si se ejecutaran por defecto.

Oliver Charlesworth
fuente
44
La respuesta es solo parcialmente correcta. El problema podría resolverse si el directorio actual solo se usara como última opción. Entonces las herramientas estándar todavía se encontrarían primero.
usuario desconocido
1
También, órdenes internas toman precedencia (es decir, cuando se escribe cden bash, se ejecuta una rutina interna para golpear y no /bin/cd) a menos que antepones con `.`
LawrenceC
3
Una de las medidas de seguridad * nix originales, obliga a ejecutar los binarios compilados por el sistema o el administrador que se encuentran en el comando de ruta asignado del sistema. Nada tan malo como que alguien inicie sesión como root en una pregunta de la mesa de ayuda, vaya a un directorio de usuarios, escriba ls y descubra que cargó una bomba dejada por un usuario.
Fiasco Labs
77
@userunknown: Y la primera vez que escribiste sl, tienes el mismo problema. Solo deben estar los directorios de confianza $PATHy las rutas relativas como nunca. son un directorio de confianza para un shell interactivo.
2
@Basic: si escribo rm -r targetcuando quise decir rm -f targetque generalmente no hay diferencia. Si escribo rm -f targetcuando quise decir rm -r target, no hay diferencia o la eliminación falla por completo. Por otra parte, creo que cada vez que antes de tipo I rm, especialmente si estoy añadiendo -fo -ro un pegote - es un comando peligroso por su naturaleza. Nadie piensa antes de lsing.
1

Significa que el directorio actual no está en la variable $ PATH.

James
fuente
1

Puede solucionar esto agregando el directorio actual (representado por un solo punto) a la PATHvariable de entorno.
La forma de hacerlo depende del shell que esté utilizando.
si está usando bash, puede agregar la línea export PATH=$PATH:.al .bashrcarchivo en su directorio de inicio.
si está utilizando csh o tcsh, agregue la línea set PATH = ($PATH .)al archivo .cshrc en su directorio de inicio.
En mi humilde opinión, para una computadora de escritorio en el hogar esto es algo aceptable para hacer, en cuanto a seguridad.

kroiz
fuente
No sabía que podemos agregar. sin embargo, hacer esto disminuirá la seguridad, ¿verdad?
Yasser Zamani