Substituição de comando interpretando espaços entre aspas como separadores de argumentos

3

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.

    
por Andrew Cheong 12.01.2014 / 23:02

2 respostas

2

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)

link

ou diretamente no bash FAQ:

link

    
por 12.01.2014 / 23:44
1

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
}
    
por 13.01.2014 / 00:55