web-dev-qa-db-fra.com

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

Quand 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 actuel est-il inclus dans la recherche lorsqu'un fichier est exécuté?

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

40
Leonid

Le $ PATH est recherché du début à la fin, le premier exécutable correspondant étant exécuté. Les répertoires au début de $ PATH ont donc priorité sur ceux qui viennent plus tard. Les exécutables du répertoire actuel (.) Ne sont exécutés que si. est dans $ PATH (ce qu'il n'est généralement pas ). Il n'y a pas d'inclusion implicite du répertoire en cours dans le chemin de recherche.

40
coneslayer

Pour les fichiers du répertoire en cours, vous voudrez les faire précéder de ./, afin que la commande devienne ./executable.sh. Vous ne devriez jamais avoir . dans votre PATH car cela 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.

L'ordre général de recherche est le suivant si je me souviens bien:

  • alias

  • fonctions exportées

  • commandes Shell intégrées

  • scripts et fichiers binaires dans votre PATH

17
John T

Bien que certains autres y aient bien répondu, j'aimerais ajouter quelques réflexions:

1) PATH est uniquement consulté si l'exécutable appelé ne contient aucun élément de chemin. certaines commandes seraient recherchées dans $ PATH, ./somecommand ou /usr/bin/somecommand ou ../../bin/somecommand en utilisant 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 trouvé, 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 en cours est dans PATH, la recherche est effectuée. Rappelez-vous qu'un répertoire vide dans PATH inclut le répertoire actuel. par exemple. PATH =:/usr/bin (vide) PATH =/usr/bin: (fin vide) et PATH =/usr/bin ::/bin (milieu vide) inclura tous les répertoires de travail actuels.

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

Il ne le trouverait jamais en cherchant PATH. Si le répertoire en cours n'est pas dans PATH, il ne le trouvera pas par 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 ne le trouvera jamais dans PATH, mais il peut être exécuté par un autre moyen.

7
Rich Homolka

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

Ensuite, vous connaîtrez l'ordre de recherche. Si vous avez plusieurs fichiers portant le même nom, exécutez simplement lequel _____ à voir.

Ex.

système #> qui grep

/ usr/bin/grep

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

à propos de grep

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

egrep (1) - imprime des lignes correspondant à un motif

fgrep (1) - imprime des lignes correspondant à un motif

grep (1) - imprime des lignes correspondant à un motif

etc...

3
mbb