
Eu tenho dois apelidos watchExpand
e l
. Eu sei que você pode fazer a expansão do bash funcionar com aliases colocando um espaço à direita assim:
alias watchExpand='watch '
l
é alias de ls -larthiF --context
. Então, quando digito o comando, watchExpand l
ele funciona perfeitamente.
No entanto, se eu fornecer um parâmetro para watchExpand
o comando, por exemplo
watchExpand -n 1 l
Meu l
alias não funciona mais. Como posso obter expansão do bash após argumentos?
Responder1
Aqui está a má ideia que eupensarvocê está pedindo:
function watchExpand() {
e=""
for param in $@
do
if alias $param >/dev/null 2>&1
then
exp=$(alias $param | cut -d= -f2| sed -e s/^\'// -e s/\'\$//)
e+=" $exp"
else
e+=" $param"
fi
done
watch $e
}
Responder2
Zsh tem aliases globais. Você poderia fazer:
alias -g @l='ls -larthiF --context'
e então:
watch -n 1 @l
Observe que isso @
não é obrigatório, mas eu o uso para evitar que os aliases globais sejam invocados involuntariamente.
Responder3
Eu descubro a solução do meu jeito.
Primeiramente, eu crio uma função chamada "addExpand" para adicionar alias/função mais facilmente, se eu quiser.
xb@dnxb:/tmp/t$ type -a addExpand
addExpand is a function
addExpand ()
{
echo -e "#!/bin/bash\nshopt -s expand_aliases\n. ~/.bash_aliases 2>/dev/null\n$1"' "$@"' | sudo tee /usr/bin/e_"$1";
sudo chmod +x /usr/bin/e_"$1"
}
xb@dnxb:/tmp/t$ addExpand l
#!/bin/bash
shopt -s expand_aliases
. ~/.bash_aliases 2>/dev/null
l "$@"
Depois de executar addExpand l
, o alias l
será criado como um arquivo executável chamado/usr/bin/e_lcom o seguinte conteúdo:
xb@dnxb:/tmp/t$ cat /usr/bin/e_l
#!/bin/bash
shopt -s expand_aliases
. ~/.bash_aliases 2>/dev/null
l "$@"
Agora aproveite para usar a versão expandida do alias/função:
xb@dnxb:/tmp/t$ watch --color -n 1 e_l /tmp //works like a charm !!!
xb@dnxb:/tmp/t$
Observação:
[1] e_l
, prefixo com 'e_' para indicar que é a versão de expansão do comando.
[2] Sinto-me muito pesado para realizar o sourcing a cada segundo se for executado com watch -n 1
. Talvez eu precise encontrar uma maneira de resolver esse problema.
[3] Outra desvantagem é que não resolve o alias recursivamente.