PATH préférence dans bashrc

2

Je me demandais ce qui se passe dans la situation suivante. Supposons que j'ai un fichier exécutable dans un répertoire qui se trouve dans PATH dans .bashrc. Si je copie également le fichier dans un autre répertoire défini dans PATH et que je l'utilise à partir du terminal, quelle copie est en cours d'exécution?

Puis-je définir une préférence pour dire «si un fichier existe à plusieurs endroits dans PATH, exécutez-le en premier lieu au lieu de celui en second lieu».

user2979409
la source
Les répertoires sont essayés dans l'ordre, de gauche à droite.
ctrl-alt-delor
Que voulez-vous dire? Je ne suis pas ce que vous dites.
user2979409
J'ai une question à propos de votre question. Souhaitez-vous poser la même question si vous n'essayez pas d'exécuter le fichier avant de le copier ailleurs?
ctrl-alt-delor
Je ne suis pas sur un ordinateur avec Linux installé pour le moment. Je suis libre de demander, à droite
user2979409
Joignez-vous à moi pour discuter afin que je puisse mieux comprendre la question. - chat.stackexchange.com/rooms/15994/…
ctrl-alt-delor

Réponses:

4

La réponse rapide

Pour savoir quelle copie bash va essayer d'exécuter, utilisez l'utilitaire intégré de bash type. Pour savoir quelle copie de du, par exemple, sera exécuté, exécutez:

$ type du
du is /usr/bin/du

La théorie

Quand vous demandez bash exécuter quelque chose, bash effectue deux étapes:

Tout d'abord, il vérifie dans son cache l'emplacement du fichier. Ceci est une liste de noms de fichiers exécutables et où le fichier a été localisé la dernière fois bash exécuté.

Deuxièmement, si le fichier ne se trouve pas dans le cache, il vérifie le chemin en recherchant chaque répertoire dans le chemin de gauche à droite.

Notez que la réponse dépend alors de l’exécution du fichier exécutable dans le shell actuel avant la copie. Si c'est le cas, bash peut avoir enregistré son emplacement dans le cache et il sera ignorer tous les nouveaux emplacements dans lesquels il peut se trouver après avoir effectué des copies. S'il ne se trouve pas dans le cache, le fichier exécuté dépend uniquement de l'ordre des répertoires dans le chemin.

Plus de détails

Pour voir ce qu'il y a dans le cache actuel de bash, lancez:

$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'

Ce qui précède montre que seulement du était dans la cache quand j'ai couru ça. Si j'exécutais plus de commandes et que je l'exécutais à nouveau, il y en aurait plus dans le cache.

Pour voir quel est le chemin actuel, lancez:

$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:/usr/X11R6/bin

Le chemin est une liste séparée par deux-points. Ce qui précède montre cinq répertoires dans le chemin. Ils seront recherchés à partir de la gauche et à droite.

Puis-je définir une préférence?

Oui, vous pouvez changer l'ordre des répertoires dans le chemin.

Vous pouvez également définir un alias pour un travail interactif. Par exemple:

$ alias dd=/opt/bin/dd

Une fois l'alias ci-dessus défini, vous pouvez taper dd en ligne de commande et bash va ignorer le cache et ignorer le PATH, et courir (ou essayer de courir) /opt/bin/dd.

John1024
la source