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.


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.


2
awktambién tiene un espacio de patrón, así awk '/^Revision/{ print ...}' que no hay necesidad de grep en este caso.
— Valentin Bajrami
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.