59 votes

Comment Unix recherche-t-il les fichiers exécutables ?

Lorsqu'un fichier est exécuté, comment Unix le recherche-t-il ? S'il y a plusieurs fichiers exécutables dans PATH avec le même nom, lequel est préféré ? Le répertoire courant est-il inclus dans la recherche lorsqu'un fichier est exécuté ?

Supposons qu'il existe un fichier dont le nom est executable.sh dans le répertoire actuel. Cela fonctionnerait-il s'il est exécuté $ executed y . ne fait pas partie de la PATH ?

55voto

coneslayer Points 8422

La recherche dans le $PATH se fait du début à la fin, le premier exécutable correspondant étant exécuté. Ainsi, les répertoires situés au début de $PATH sont prioritaires sur ceux qui viennent après. Les exécutables du répertoire courant (.) ne sont exécutés que si . se trouve dans $PATH (ce qui n'est pas le cas). ne l'est généralement pas ). Il n'y a pas d'inclusion implicite du répertoire courant dans le chemin de recherche.

20voto

Dalroth Points 2468

Pour les fichiers dans le répertoire courant, vous voudrez les faire précéder de la mention ./ La commande deviendrait donc ./executable.sh . Vous n'auriez jamais dû . dans votre PATH car il pose un risque de sécurité, entre autres problèmes.

Les répertoires qui viennent en premier dans le PATH et qui sont recherchés en premier.

En commande globale pour la recherche est comme ça si je me souviens bien :

  • alias

  • fonctions exportées

  • commandes Shell intégrées

  • scripts et binaires dans votre PATH

10voto

Lark Points 1640

Bien que d'autres aient déjà répondu à cette question, j'aimerais ajouter quelques réflexions :

1) PATH n'est consulté que si l'exécutable invoqué ne contient aucun élément de chemin. Une commande serait recherchée dans $PATH, ./somecommand o /usr/bin/somecommand ou ../../bin/somecommand utilisez simplement les règles de répertoire, pas PATH

S'il y a plusieurs fichiers exécutables dans PATH avec le même nom, lequel est préféré ?

Il s'arrête au premier qu'il trouve, en lisant $PATH de gauche à droite.

Le répertoire courant est-il inclus dans la recherche lorsque le fichier est exécuté ?

Si le répertoire courant est dans PATH alors il est recherché. Rappelez-vous qu'un répertoire vide dans PATH inclut le répertoire courant. Par exemple, PATH=:/usr/bin (vide au début) PATH=/usr/bin : (vide à la fin) et PATH=/usr/bin::/bin (vide au milieu) incluront tous effectivement le répertoire de travail courant.

Supposons qu'il existe un fichier portant le nom executable.sh dans un répertoire courant. Cela fonctionnerait-il s'il est exécuté $ et . ne fait pas partie du PATH ?

Il ne le trouverait jamais en cherchant dans PATH. Si le répertoire actuel n'est pas dans PATH, il ne le trouvera pas en effectuant une recherche dans PATH.

Cela dit (et désolé d'ajouter de la confusion), s'il y avait un alias ou une fonction qui exécutait la commande, elle serait exécutée. Ou si votre Shell avait un cache d'emplacement, et que l'exécutable était dans le cache, il pourrait le trouver. Ainsi, il jamais le trouver dans PATH, mais il peut être exécuté par d'autres moyens.

4voto

mbb Points 2416

Pour voir quel est votre chemin actuel, tapez simplement echo $PATH ou printenv PATH .

Vous connaîtrez alors l'ordre de recherche. Si vous avez plusieurs fichiers avec le même nom, il suffit d'exécuter quel ____ pour voir.

Ex.

system#> which grep

/usr/bin/grep

un moyen cool de trouver des fichiers qui fonctionnent comme votre cible est d'utiliser apropos :

Grep à propos

bzgrep (1) - recherche d'une expression régulière dans des fichiers éventuellement compressés par bzip2

egrep (1) - affiche les lignes correspondant à un motif

fgrep (1) - affiche les lignes correspondant à un motif

grep (1) - affiche les lignes correspondant à un motif

et ainsi de suite...

-4voto

proc Points 1

@coneslayer- L'ordre par défaut de recherche des exécutables est le chemin actuel, les commandes intégrées et ensuite le $PATH. Ainsi, si une fonction nommée exécutable existe déjà dans le pwd, alors elle est exécutée. Si ce n'est pas le cas, la préséance recherche les commandes intégrées de Shell et ensuite $PATH.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X