No meu .profile
(originado no sh
modo de emulação do meu .zshrc
), tenho o seguinte snippet:
if [ -f /usr/bin/pacmatic ]; then
alias pacman=pacmatic
fi
# Colorized Pacman output
alias pacman="pacman --color auto"
No entanto, o segundo alias sempre substitui o primeiro:
% type pacman
pacman is an alias for pacman --color auto
Como posso fazer com que a segunda atribuição de alias "herda" a primeira atribuição, para que, se /usr/bin/pacmatic
existir, o alias se torne pacmatic --color auto
?
Eu não sou avesso a usar funções em vez de aliases, mas eu preferiria que se a lógica não fosse executada toda vez que pacman
for invocada (quero pacmatic
verificar uma vez, na inicialização do shell, nem sempre pacman
é executada). Eu também prefiro um sh
script portável, mas se isso não for possível, você pode usar a zsh
sintaxe completa .
(Sim, estou ciente de que isso poderia ser facilmente resolvido anexando- --color auto
se ao pacmatic
pseudônimo. Mas quero fazê-lo da maneira certa ™.)
Eu tentei pesquisar no Google e procurar nas páginas de manual, mas sem sucesso.
bash
) e podem facilmente ligar um para o outro.Respostas:
Um shell
alias
se comporta de maneira semelhante a um#define
, ou seja, redefinir um alias de shell substituiria o anterior.Não sei ao certo qual seria o Right Way TM , mas uma abordagem seria usar uma função shell que aceite parâmetros e usá-la para criar um alias. Seu snippet de código pode ser reescrito como:
Além disso, mesmo que você estivesse usando aliases diferentes e estivesse tentando usar um para definir o outro, ele não funcionaria, pois os aliases não são expandidos no modo não interativo por padrão. Você precisa habilitá-lo, definindo
expand_aliases
:Citando o manual:
fonte
type pacman
retornapacman is an alias for pacman --color auto
, tanto nosh
modo de emulação quanto nozsh
modo nativo . no entanto, parece que a edição que você acabou de fazer é o que eu preciso.setopt aliases
.zsh
. E o shell parece ser interativo de qualquer maneira.A substituição do alias é executada apenas ao ler linhas de fontes interativas. Portanto, o segundo alias não é afetado pelo primeiro, daí a substituição literal.
Talvez algo semelhante:
Isso definirá 'pacman' para o valor adequado, a variável env PACMAN não será exportada, portanto desaparecerá quando o script terminar e o uso de "aspas duplas" garantirá que a substituição da variável ocorra na declaração do alias, não para cada chamada.
Eu uso um método semelhante:
Basicamente, defina o env var PACMAN, teste para pacmatic no caminho, se encontrado, defina PACMAN e defina o alias.
Hmm, você poderia otimizar um pouco mais ...
Taa Daa! Defina como 'pacman' se PACMAN estiver desabilitado ou nulo; caso contrário, defina o valor de PACMAN, defina pacmatic pela linha 'what'.
fonte
bash
não expande aliases no modo não interativo, mas como isso é o mesmo que "fontes interativas"?No zsh, você pode facilmente anexar a um alias usando a
aliases
matriz associativa:Em outros shells, você precisa usar a saída do
alias
comando para descobrir os aliases existentes.Enquanto estou oferecendo isso como uma possibilidade, eu continuaria usando uma variável, como já sugerido por outras respostas. É mais claro e você pode discriminar o valor da variável se desejar configurar algumas coisas de maneira diferente com base em qual delas está
pacmatic
oupacman
está em uso.fonte
Uma versão curta para o segundo alias seria:
fonte
Aliases são para os pássaros.
fonte