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
}