¿Cómo busca Unix los archivos ejecutables?


47

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.shen el directorio actual. ¿Funcionaría eso si se ejecuta $ executedy .no forma parte del PATH?


mencionar el which <executable>comando será útil en este hilo.
Contador م

Respuestas:


45

$ 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.


Es extraño que mi $ PATH no contenga ., pero parece que buscaría primero en el directorio actual, antes de verificar los directorios definidos en $ PATH.
Eric Wang

19

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


77
Agregaría el hash: recuerde que bash (y tal vez otros shells) mantienen un hash de los comandos utilizados recientemente para facilitar su búsqueda. A veces tiene que purgar el caché (usando hash -r) si cambia su RUTA o la ubicación del programa.
Rich Homolka

3
+1 para el orden de búsqueda. Sería bueno si pudiera recordar la fuente de información :)
twan163

8

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 ./somecommando /usr/bin/somecommand, o ../../bin/somecommandsimplemente usaría reglas de directorio, no PATH

Si hay varios archivos ejecutables en PATH con el mismo nombre, ¿cuál es el preferido?

Se detiene en el primero que encuentra, leyendo $ PATH de izquierda a derecha.

¿Se incluye el directorio actual en la búsqueda cuando se ejecuta el archivo?

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.

Supongamos que hay un archivo con el nombre ejecutable.sh en un directorio actual. ¿Funcionaría si se ejecuta $ ejecutar y. no es parte del camino?

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.


Gracias por la cachenota, 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 $PATHhasta que cerré la sesión y volví a iniciar sesión.
Contador م

1
@ theaccountant en bash puedes hacer 'hash -r' para borrar el caché de shell
Rich Homolka

4

Para ver cuál es su ruta actualmente, simplemente escriba echo $PATHo printenv PATH.

Entonces sabrás el orden de búsqueda. Si tiene varios archivos con el mismo nombre, simplemente ejecute qué ____ para ver.

Ex.

sistema #> que grep

/ usr / bin / grep

Una forma genial de encontrar archivos que funcionen como su objetivo es usar a propósito:

a propósito grep

bzgrep (1) - busca posiblemente archivos comprimidos bzip2 para una expresión regular

egrep (1): imprime líneas que coinciden con un patrón

fgrep (1): imprime líneas que coinciden con un patrón

grep (1): imprime líneas que coinciden con un patrón

y así...


2
Ah sí, olvidé la función whereis para encontrar TODAS las instancias de un archivo:> whereis grep
mbb

grep: / bin / grep / usr / bin / grep /usr/share/man/man1/grep.1.gz
mbb

whereisusa una lista codificada de ubicaciones, no $PATH.
Grawity

@grawity ¿Podrías ampliar eso?
WinEunuuchs2Unix

-2

@ 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


Si estuvieras hablando de la concha de Thompson, la concha de Mashey o algún otro remanente fosilizado de hace 40 años, es posible que tengas razón. Pero ningún shell actual de Unix busca el directorio actual automáticamente.
Scott

@Scott Entonces, la ruta de búsqueda predeterminada para un comando primero está integrada y luego $ PATH y busca en el CWD solo si doy ./? Estoy en lo cierto?
proceso

Bueno, alias, funciones y componentes incorporados. Luego, si especifica una ruta con el comando (incluido ./), solo busca en ese directorio; de lo contrario, busca $PATH.
Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.