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 y ait un fichier avec nom 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
?
which <executable>
commande sera utile dans ce fil.Réponses:
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 qui n'est généralement pas le cas ). Il n'y a pas d'inclusion implicite du répertoire en cours dans le chemin de recherche.
la source
.
, mais il semble qu'il faudrait d'abord chercher dans le répertoire courant, avant de vérifier les répertoires définis dans $ PATH lui-même.Pour les fichiers du répertoire en cours, vous voudrez les faire précéder
./
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
la source
hash -r
) si vous modifiez votre chemin PATH ou l'emplacement du programme.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 bien/usr/bin/somecommand
,../../bin/somecommand
utilisez simplement les règles de répertoires, pas PATHIl s'arrête au premier trouvé, lisant $ PATH de gauche à droite.
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.
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. Donc, il ne le trouvera jamais dans PATH, mais il peut être géré par d'autres moyens.
la source
cache
note, cela me rend presque fou que l'ancien exécutable de/usr/bin/
soit toujours invoqué, pas le nouveau/usr/local/bin
, mais il est à gauche dans la$PATH
caisse où je me suis déconnecté puis reconnecté.Pour voir quel est votre chemin
echo $PATH
, tapez simplement , ouprintenv 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.
un moyen pratique de trouver des fichiers qui fonctionnent comme votre cible est d’utiliser apropos:
etc...
la source
whereis
utilise une liste codée en dur d'emplacement, pas$PATH
.@ coneslayer- L'ordre de recherche par défaut de l'exécutable est le chemin actuel, les commandes intégrées, puis le $ PATH. Donc, si une fonction nommée exécutable existe déjà dans le pwd, c'est exécuté. Si ce n'est pas le cas, la recherche de priorité recherche les commandes intégrées du shell, puis $ PATH
la source
./
), il ne recherche que ce répertoire; sinon, il cherche$PATH
.