substituição preguiçosa do bashrc


10

Como obter ~/.bashrcaliases para avaliar $()substituições no tempo de execução , em vez de no momento em que ~ / .bashrc é executado (ao abrir um terminal)?

Eu executo esse comando com frequência suficiente para adicionar um alias para ele:

svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff

No entanto, quando o adiciono ~/.bashrccomo um alias, vejo que as avaliações são codificadas de acordo com os valores que tinham no momento em que abri o terminal:

$ alias
alias svnbranch='svn diff -r 178184:HEAD svn+ssh://branches/t4252 | colordiff'

Se eu abrir um terminal ~, recebo erros:

svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
$ alias
alias svnbranch='svn diff -r :HEAD  | colordiff'
$

Eu tentei essas duas variações do alias ~/.bashrc, ambas têm o mesmo efeito (como eu esperava):

alias svnbranch="svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff"
alias svnbranch="svn diff -r `svn info | grep ^Revision | awk {'print $2'}`:HEAD `svn info | grep ^URL | awk {'print $2'}` | colordiff"

Como obter ~/.bashrcaliases para avaliar $()substituições em tempo de execução ?

Além disso, como alguém pesquisaria essa situação no Google? Tentei pesquisar no google sobre "substituição do bashrc", "substituição do preguiçoso do bashrc" e outras frases-chave, mas não encontrei nada para o que considero ser um problema bastante comum para encontrar informações.


2
Por que tem que ser um apelido? Mova-o para um script de shell e pronto. A maioria dos sistemas do tipo * ix é inserida $HOME/binno PATHdiretório se você tiver esse diretório atualmente.
22815 Warren Young

@ WarrenYoung: Você está correto, essa instância em particular pode ser um script. No entanto, eu ainda gostaria de saber a resposta, pois prefiro apelidos para outras coisas e certamente vou me deparar com isso. Eu poderia generalizar sua pergunta em "por que o Bash suporta aliases quando algo pode ser um script".
dotancohen

Por que o voto negativo? Como eu poderia melhorar a pergunta? Forneci exemplos, tentativas fracassadas e até as frases-chave nas quais tentei pesquisar no Google.
dotancohen

@dotancohen: Eu acho que você deveria perguntar isso separadamente. Vou dar uma resposta parcial aqui: alias cdp="cd ~/projects". Não é possível fazer isso em um script de shell.
Warren Young

Respostas:


11

Use aspas simples para suprimir o processamento de caracteres especiais. Você também pode inverter as barras$ .

Para um comando complexo, é melhor usar uma função em qualquer caso, que não requer escape e é mais fácil de ler e editar:

svnbranch() {
    svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff
}

Você pode definir uma função em qualquer lugar que possa definir um alias.


2
awktem um espaço padrão também. awk '/^Revision/{ print ...}' Portanto, não há necessidade de grep neste caso.
Valentin Bajrami
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.