En mi .profile
(originado en sh
modo de emulación de mi .zshrc
) tengo el siguiente fragmento:
if [ -f /usr/bin/pacmatic ]; then
alias pacman=pacmatic
fi
# Colorized Pacman output
alias pacman="pacman --color auto"
Sin embargo, el segundo alias siempre anula al primero:
% type pacman
pacman is an alias for pacman --color auto
¿Cómo puedo hacer que la segunda asignación de alias "herede" la primera asignación, de modo que si /usr/bin/pacmatic
existe, el alias se convierta pacmatic --color auto
?
No soy reacio a usar funciones en lugar de alias, pero preferiría que no se realizara la lógica cada vez que pacman
se invoca (quiero pacmatic
comprobar por una vez, en el inicio del shell, no cada vez que pacman
se ejecuta). También preferiría un sh
script portátil, pero si esto no es posible, puede usar la zsh
sintaxis completa .
(Sí, soy consciente de que esto podría resolverse fácilmente agregando --color auto
el pacmatic
alias. Pero quiero hacerlo de la manera correcta).
He intentado buscar en Google y revisar las páginas de manual, pero fue en vano.
bash
), y pueden llamarse fácilmente entre sí.Respuestas:
Un shell se
alias
comporta de manera bastante similar a un#define
, es decir, redefinir un alias de shell anularía el anterior.No estoy seguro de cuál sería el Right Way TM , pero un enfoque sería utilizar una función de shell que acepte parámetros y usarla para crear un alias. Su fragmento de código podría reescribirse como:
Además, incluso si usara diferentes alias y tratara de usar uno para definir el otro, no funcionaría ya que los alias no se expanden en modo no interactivo de manera predeterminada. Debe habilitarlo configurando
expand_aliases
:Citando del manual:
fuente
type pacman
vuelvepacman is an alias for pacman --color auto
, tanto ensh
modo de emulación como enzsh
modo nativo . Sin embargo, parece que la edición que acabas de hacer es lo que necesito.setopt aliases
.zsh
. Y el shell parece ser interactivo de todos modos.La sustitución de alias solo se realiza al leer líneas de fuentes interactivas. Entonces, el segundo alias no se ve afectado por el primero, de ahí el reemplazo literal.
Quizás algo similar:
Esto establecerá 'pacman' en el valor adecuado, la variable env PACMAN no se exporta, por lo que desaparecerá cuando finalice el script, y el uso de "comillas dobles" asegurará que se produzca la sustitución de la variable en la declaración del alias, No para cada invocación.
Yo uso un método similar:
Básicamente, configure el env var PACMAN, pruebe pacmatic en la ruta, si se encuentra, configure PACMAN, luego defina el alias.
Hmm, podrías optimizar un poco más ...
Taa Daa! Establezca en 'pacman' si PACMAN no está configurado o es nulo; de lo contrario, establezca el valor de PACMAN, establezca en pacmatic mediante la línea 'which'.
fuente
bash
no expande los alias en modo no interactivo, pero ¿cómo es eso lo mismo que "fuentes interactivas"?En zsh, puede agregar fácilmente un alias utilizando la
aliases
matriz asociativa:En otros shells, debe usar la salida del
alias
comando para obtener información sobre los alias existentes.Si bien estoy ofreciendo esto como una posibilidad, seguiría usando una variable como ya lo sugieren otras respuestas. Es más claro, y se puede discriminar por el valor de la variable si desea configurar algunas cosas diferente en función de la cual uno de
pacmatic
opacman
está en uso.fuente
Una versión corta para el segundo alias sería:
fuente
Los alias son para los pájaros.
fuente