L'alias ne «remplace» pas les entrées PATH?

9

La dernière ligne de mon .bash_profileest:

alias cp=/usr/local/bin/gcp

Cependant, cela est écrasé par l'entrée dans mon $PATH:

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

J'avais pensé que les alias remplaçaient le PATH..?

javadba
la source
1
Pour mémoire: techniquement, alias ne pas remplacent les valeurs du PATHenvar.
can-ned_food
Attention obligatoire: En règle générale, il n'est pas recommandé de renommer les commandes courantes. Cela peut vous mordre de deux façons. 1) Si vous travaillez sur un autre système et utilisez votre commande par habitude, vous obtiendrez le comportement inattendu de la commande native. 2) Si quelqu'un d'autre utilise votre système, même pour vous conseiller / vous aider à résoudre un problème, il obtiendra le comportement inattendu de votre personnalisation. Les commandes personnalisées conviennent, ne les nommez pas de la même manière que les commandes existantes.
Joe
@joe En fait, c'est plus l' inverse ici: la version os / x de cp manque d'options de nix, donc il ne se comporte pas comme prévu (sauf pour ceux qui * aiment la version mac
entravée

Réponses:

21

La whichcommande ne renvoie que les exécutables: elle ne sait rien des alias, car il s'agit d'un programme externe, et il n'y a pas de mécanisme pour transmettre des informations d'alias à un processus enfant.

Si vous entrez la commande, type -a cpvous verrez toutes les interprétations possibles, par ordre de préférence. Cela inclut tout alias, car il types'agit d'une bashcommande interne.

Il est important de réaliser qu'un alias ne sera pas interprété par un sous-processus, tel qu'un script ou un éditeur interactif qui a une option pour exécuter des commandes système.

Si vous créez cpune fonction, votre version s'exécutera dans des scripts, mais pas à partir d'autres programmes:

cp() { /usr/local/bin/gcp "$@"; }

Si vous voulez que vous cptravailliez partout, ajoutez $HOME/binen tête de votre PATHliste et $HOME/bin/cppointez-la vers elle:

ln -s /usr/local/bin/gcp $HOME/bin/cp

Cela crée un lien symbolique, bien que vous puissiez en faire un lien dur légèrement plus efficace (omis -s), mais cela nécessite normalement des autorisations root ( sudo ln ...). La création d'une fonction et son ajout à la PATHvariable se feront dans l'un des bashscripts de démarrage, avec des autorisations utilisateur.

AFH
la source
1
Bien que sur CentOS (et AIUI tous RedHat), le profil standard (sauf substitution) crée un alias pour whichqui s'exécute /usr/bin/whichavec une entrée redirigée à partir de la sortie de aliaset une option qui lui dit de lire cette entrée et de l'utiliser pour afficher un alias s'il correspond à la commander. Voir unix.stackexchange.com/questions/10525/…
dave_thompson_085
@ dave_thompson_085 - Commentaire intéressant: je n'ai pas utilisé ces distributions. J'utilise Ubuntu et je peux obtenir le même effet simplement aliasing whichà type. which -aFonctionne ensuite comme le programme externe, avec l'ajout des définitions d'alias et de fonctions. En général, je ne le fais pas alias which=type, car j'aime utiliser $(which ProgName)quand je veux forcer l'utilisation d'un programme externe, en contournant tout alias ou définitions de fonctions.
AFH
1
Les liens matériels ne peuvent pas traverser les systèmes de fichiers, donc la lnsuggestion non symbolique ne fonctionnera que si votre répertoire personnel se trouve sur le même système de fichiers que /usr/local/bin. Il se comportera également bizarrement si vous mettez à jour gcp, car votre lien dur fera probablement toujours référence à l'ancienne version.
inutile
@Useless - Points valides, ce qui explique en partie pourquoi j'ai modifié ma réponse pour suggérer d'abord un lien symbolique, bien que je pense que les autorisations soient probablement la considération la plus importante. Quant à la mise à jour gcp, cela dépendra si la mise à jour se fait par ouverture et écriture ou par suppression et recréation. Notez qu'il importe peu qu'un chemin source absolu ou relatif soit utilisé pour créer un lien dur, tandis qu'un lien symbolique a généralement besoin d'un chemin absolu. Les liens sont largement utilisés dans le système d'exploitation, et ils sont principalement symboliques.
AFH
1
@ can-ned_food - Ce n'est pas aussi simple que de le définir dans le shell actuel: il doit être défini dans chaque script, avec l'importation des alias.
AFH
13

Les alias sont internes au shell. D'autres programmes n'en sauront rien.

whichn'est pas une fonction intégrée de Bash (c'est une fonction intégrée dans certains autres shells, par exemple zsh). Puisqu'il whichn'a aucune information privilégiée dans les alias de Bash, whichrecherche simplement PATHle terme donné.

type, d'autre part, est un Bash intégré, il peut donc rendre compte des alias.

8bittree
la source
2
Et, aussi, les alias ne sont développés que si le premier mot d'une commande. Ce n'est peut-être pas pertinent.
can-ned_food