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

Lorsqu'un fichier est exécuté, comment Unix le recherche-t-il? S'il existe 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 y ait un fichier avec le nom executable.sh dans le répertoire actuel. Cela fonctionnerait si cela est exécuté $ executed et . Ne fait-il pas partie du PATH ?

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

Pour les fichiers dans le répertoire actuel, vous voudrez les précéder avec ./ , de sorte que la commande deviendrait ./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 chemin d'accès et recherché en premier.

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

  • Alias

  • Fonctions exportées

  • Commandes de shell intégrées

  • Scripts et binaires dans votre PATH

Bien que cela ait bien répondu par d'autres, j'aimerais ajouter quelques réflexions:

1) PATH est seulement consulté si l'exécutable invoqué n'a pas d'éléments de chemin d'accès. Somecommand serait recherché dans $ PATH, ./somecommand ou /usr/bin/somecommand , ou ../../bin/somecommand utilisez les règles d'annuaire, pas PATH

S'il existe plusieurs fichiers exécutables dans PATH avec le même nom que celui qui est préféré?

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

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

Si le répertoire actuel est dans PATH, il est recherché. N'oubliez pas qu'un répertoire vide dans PATH inclut le répertoire actuel. Par exemple PATH =: / usr / bin (menant vide) PATH = / usr / bin: (trailing empty) et PATH = / usr / bin :: / bin (milieu vide) vont tous intégrer efficacement le répertoire de travail actuel.

Supposons qu'il y ait un fichier avec le nom exécutable.sh dans un répertoire actuel. Cela fonctionnerait si cela est exécuté $ exécuté et. Ne fait-il pas partie du PATH?

Il ne le trouverait jamais en recherchant PATH. Si le répertoire actuel n'est pas dans PATH, il ne le trouvera pas par une recherche 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, il serait exécuté. Ou si votre shell possédait un cache de localisation, et l'exécutable était dans le cache, il pourrait le trouver. Donc, il ne le trouvera jamais dans PATH, mais il peut être exécuté par d'autres moyens.

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

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

Ex.

System #> which grep

/ Usr / bin / grep

Un moyen formidable de trouver des fichiers qui fonctionnent comme votre cible est d'utiliser à propos de:

À propos de grep

Bzgrep (1) – recherchez éventuellement des fichiers compressés bzip2 pour une expression régulière

Egrep (1) – imprimer des lignes correspondant à un motif

Fgrep (1) – imprimer des lignes correspondant à un motif

Grep (1) – imprimer des lignes correspondant à un motif

etc…