sustitución perezosa de bashrc

10

¿Cómo se obtienen ~/.bashrcalias para evaluar las $()sustituciones en tiempo de ejecución , en lugar de en el momento en que se ejecuta ~ / .bashrc (al abrir un terminal)?

Ejecuto este comando con suficiente frecuencia que me gustaría agregarle un alias:

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

Sin embargo, cuando lo agrego ~/.bashrccomo un alias, veo que las evaluaciones están codificadas con los valores que tenían en el momento en que abrí el terminal:

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

Si abro un terminal, ~entonces recibo errores:

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'
$

He probado estas dos variaciones del alias en ~/.bashrc, ambos tienen el mismo efecto (como esperaba):

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"

¿Cómo se obtienen ~/.bashrcalias para evaluar las $()sustituciones en tiempo de ejecución ?

Además, ¿cómo buscaría esta situación en Google? He intentado buscar en Google "sustitución bashrc", "sustitución perezosa bashrc" y otras frases clave, pero no he encontrado nada para lo que considero que debería ser un problema lo suficientemente común como para encontrar información.

dotancohen
fuente
2
¿Por qué tiene que ser un alias? Muévalo a un script de shell y termine con él. La mayoría de los sistemas de tipo * ix se colocan $HOME/binen el PATHsi tiene un directorio de este tipo en estos días.
Warren Young
@WarrenYoung: Tienes razón, esta instancia en particular podría ser un script. Sin embargo, todavía me gustaría saber la respuesta, ya que prefiero los alias para otras cosas y ciertamente me encontraré con esto. Podría generalizar su pregunta en "por qué Bash admite alias cuando algo podría ser un script".
dotancohen
¿Por qué el voto negativo? ¿Cómo podría mejorar la pregunta? He proporcionado ejemplos, intentos fallidos e incluso las frases clave que intenté buscar en Google.
dotancohen
@dotancohen: Creo que deberías preguntar eso por separado. Voy a dar una respuesta parcial aquí: alias cdp="cd ~/projects". No se puede hacer eso en un script de shell.
Warren Young

Respuestas:

11

Use comillas simples para suprimir el procesamiento de caracteres especiales. También puede hacer una barra diagonal inversa del $ s.

Para un comando complejo, probablemente sea mejor usar una función en cualquier caso, que no requiere ningún escape y es más fácil de leer y editar:

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

Puede definir una función en cualquier lugar donde pueda definir un alias.

Michael Homer
fuente
2
awktambién tiene un espacio de patrón, así awk '/^Revision/{ print ...}' que no hay necesidad de grep en este caso.
Valentin Bajrami