Você pode eval
para conseguir o que deseja:
function tailias
{
eval $(echo "alias $1='${*:2}'" | tee -a ~/.bashrc)
}
Isto é melhor explicado nesta questão (onde uma solução alternativa é dada)
ou diretamente no bash FAQ:
Gostaria que um alias
fosse adicionalmente anexado a ~/.bashrc
, por exemplo.
function tailias
{
$(echo "alias $1='${*:2}'" | tee -a ~/.bashrc)
}
Estou usando tee
para dividir o comando para ~/.bashrc
, deixando o stdout intacto para ser executado por $()
.
Isso funciona bem para aliasing comandos de uma palavra, por exemplo.
[/home/acheong87] tailias f g
[/home/acheong87] alias
alias f='g'
e vejo isso anexado ao meu ~/.bashrc
. Mas para comandos com espaços, recebo
[/home/acheong87] tailias ll 'ls -al'
-bash: alias: -al: not found
Parece correto em ~/.bashrc
-
alias ll='ls -al'
- mas na lista de alias eu recebo essa coisa louca:
[/home/acheong87] alias
alias ll=''\''ls'
Eu tentei colocar as citações em lugares diferentes, sem sucesso. Reduzi a função para apenas o echo
e, como no ~/.bashrc
, parece correto - por isso não consigo descobrir qual passo oculto está evitando minha atenção.
Em vez de usar eval
e tee
para executar o comando duas vezes para adicionar um alias
e alias
permanente em ~/.bashrc
, você pode simplesmente recarregar o arquivo ~/.bashrc
após ele ser anexado, que atualizará a lista de alias.
function tailias
{
echo "alias $1='${*:2}'" >> ~/.bashrc && source ~/.bashrc
}