Dans mon .profile
(provenant en sh
mode d'émulation de mon .zshrc
), j'ai l'extrait de code suivant:
if [ -f /usr/bin/pacmatic ]; then
alias pacman=pacmatic
fi
# Colorized Pacman output
alias pacman="pacman --color auto"
Cependant, le deuxième alias remplace toujours le premier:
% type pacman
pacman is an alias for pacman --color auto
Comment puis-je faire en sorte que la deuxième affectation d'alias "hérite" de la première affectation, de sorte que s'il /usr/bin/pacmatic
existe, l'alias devienne pacmatic --color auto
?
Je ne suis pas opposé à l'utilisation de fonctions au lieu d'alias, mais je préférerais que la logique ne soit pas exécutée à chaque pacman
invocation (je veux pacmatic
vérifier une fois, au démarrage du shell, pas à chaque pacman
exécution). Je préférerais également un sh
script -portable, mais si ce n'est pas possible, vous pouvez utiliser la zsh
syntaxe complète .
(Oui, je suis conscient que cela pourrait facilement être résolu en ajoutant --color auto
à l' pacmatic
alias. Mais je veux le faire de la bonne façon ™.)
J'ai essayé Google et en parcourant les pages de manuel, mais en vain.
bash
) et qu'ils peuvent facilement s'appeler.Réponses:
Un shell
alias
se comporte de manière assez similaire à a#define
, c'est-à-dire que la redéfinition d'un alias de shell remplacerait le précédent.Je ne suis pas sûr de ce que serait le Right Way TM , mais une approche consisterait à utiliser une fonction shell qui accepte des paramètres et à l'utiliser pour créer un alias. Votre extrait de code peut être réécrit comme suit:
De plus, même si vous utilisiez différents alias et tentiez d'en utiliser un pour définir l'autre, cela ne fonctionnerait pas car les alias ne sont pas développés en mode non interactif par défaut. Vous devez l'activer en définissant
expand_aliases
:Citant du manuel:
la source
type pacman
renvoiepacman is an alias for pacman --color auto
, à la fois ensh
mode émulation et enzsh
mode natif . cependant, on dirait que la modification que vous venez de faire est ce dont j'ai besoin.setopt aliases
.zsh
. Et le shell semble être interactif de toute façon.La substitution d'alias n'est effectuée que lors de la lecture de lignes à partir de sources interactives. Le deuxième alias n'est donc pas affecté par le premier, d'où le remplacement littéral.
Peut-être quelque chose de similaire:
Cela définira «pacman» à la valeur appropriée, la variable env PACMAN n'est pas exportée, donc elle disparaîtra à la fin du script, et l'utilisation de «guillemets doubles» garantira que la substitution de variable se produira lors de la déclaration de l'alias, pas pour chaque invocation.
J'utilise une méthode similaire:
Fondamentalement, définissez l'env var PACMAN, testez pacmatic in path, s'il est trouvé, définissez PACMAN, puis définissez l'alias.
Hmm, vous pourriez optimiser un peu plus ...
Taa Daa! Définissez sur «pacman» si PACMAN est non défini ou nul, sinon, définissez sur la valeur de PACMAN, défini sur pacmatic par la ligne «which».
la source
bash
ne développe pas les alias en mode non interactif, mais en quoi est-ce la même chose que les "sources interactives"?Dans zsh, vous pouvez facilement ajouter à un alias en utilisant le
aliases
tableau associatif:Dans d'autres shells, vous devez utiliser la sortie de la
alias
commande pour connaître les alias existants.Bien que j'offre cela comme une possibilité, j'irais avec l'utilisation d'une variable comme déjà suggéré par d'autres réponses. C'est plus clair et vous pouvez discriminer la valeur de la variable si vous souhaitez configurer certaines choses différemment en fonction de celle
pacmatic
ou de celle quipacman
est utilisée.la source
Une version courte pour le 2ème alias serait:
la source
Les alias sont pour les oiseaux.
la source