Cuando se ejecuta un archivo, ¿cómo lo busca Unix? Si hay varios archivos ejecutables en PATH con el mismo nombre, ¿cuál es el preferido? ¿Se incluye el directorio actual en la búsqueda cuando se ejecuta un archivo?
Supongamos que hay un archivo con nombre executable.sh
en el directorio actual. ¿Funcionaría eso si se ejecuta $ executed
y .
no forma parte del PATH
?
which <executable>
comando será útil en este hilo.Respuestas:
$ PATH se busca de principio a fin, y se ejecuta el primer ejecutable coincidente. Por lo tanto, los directorios al comienzo de $ PATH tienen prioridad sobre los que vienen después. Los ejecutables en el directorio actual (.) Solo se ejecutan si. está en $ PATH (que generalmente no es ). No hay una inclusión implícita del directorio actual en la ruta de búsqueda.
fuente
.
, pero parece que buscaría primero en el directorio actual, antes de verificar los directorios definidos en $ PATH.Para los archivos en el directorio actual, querrá precederlos con
./
, para que el comando se convierta./executable.sh
. Nunca debe tener.
en su RUTA, ya que representa un riesgo de seguridad, entre otros problemas.Directorios que aparecen primero en la RUTA y buscados primero.
El orden general de búsqueda es así si no recuerdo mal:
alias
funciones exportadas
comandos de shell integrados
guiones y binarios en su RUTA
fuente
hash -r
) si cambia su RUTA o la ubicación del programa.Aunque algunos otros han respondido bien a esto, me gustaría agregar algunas ideas:
1) PATH solo se consulta si el ejecutable invocado no tiene elementos de ruta en él. algún comando se buscaría en $ PATH
./somecommand
o/usr/bin/somecommand
, o../../bin/somecommand
simplemente usaría reglas de directorio, no PATHSe detiene en el primero que encuentra, leyendo $ PATH de izquierda a derecha.
Si el directorio actual está en RUTA, entonces se busca. Recuerde que un directorio vacío en PATH incluye el directorio actual. por ejemplo, RUTA =: / usr / bin (inicial vacía) RUTA = / usr / bin: (final vacía) y RUTA = / usr / bin :: / bin (medio vacío) incluirán efectivamente el directorio de trabajo actual.
Nunca lo encontraría al buscar RUTA. Si el directorio actual no está en PATH, no lo encontrará mediante una búsqueda de PATH.
Dicho esto (y lamento añadir confusión) si hubiera un alias o función que ejecutara el comando, se ejecutaría. O si su shell tenía un caché de ubicación y el ejecutable estaba en el caché, puede encontrarlo. Por lo tanto, nunca lo encontrará en PATH, pero puede ejecutarse por otros medios.
fuente
cache
nota, casi me vuelve loco que el antiguo ejecutable en/usr/bin/
todavía no se invoque al nuevo/usr/local/bin
, sin embargo, está a la izquierda$PATH
hasta que cerré la sesión y volví a iniciar sesión.Para ver cuál es su ruta actualmente, simplemente escriba
echo $PATH
oprintenv PATH
.Entonces sabrás el orden de búsqueda. Si tiene varios archivos con el mismo nombre, simplemente ejecute qué ____ para ver.
Ex.
Una forma genial de encontrar archivos que funcionen como su objetivo es usar a propósito:
y así...
fuente
whereis
usa una lista codificada de ubicaciones, no$PATH
.@ coneslayer: el orden predeterminado para encontrar el ejecutable es la ruta actual, los comandos integrados y luego el $ PATH. Entonces, si una función llamada ejecutable ya existe en el pwd, entonces se ejecuta. Si no, entonces la precedencia busca comandos integrados de shell y luego $ PATH
fuente
./
), solo busca en ese directorio; de lo contrario, busca$PATH
.