comando bash alias con comillas simples y dobles

81

Tengo este comando que hace lo que quiero, pero no puedo ponerle un alias en mi .bashrc (tenga en cuenta que usa comillas simples y dobles):

svn status | awk '$1 =="M"{print $2;}'

He intentado:

alias xx="svn status | awk '$1 ==\"M\"{print $2;}'"

Y algunas otras combinaciones de sentido común sin suerte ... Sé que bash es muy exigente con las comillas ... Entonces, ¿cuál es la forma correcta de ponerle un alias y por qué? Gracias

programador_pragmático
fuente

Respuestas:

108

Solo necesitas escapar correctamente.

alias xxx="svn status | awk '\$1 ==\"M\"{print \$2;}'"
novato
fuente
16
Así que no estaba escapando del $ .. ¡No lo sabía!
pragmatic_programmer
7
¡Agradable! ¡Yo tampoco sabía que tenía que escapar del '$'!
Shadoninja
1
Buena respuesta, pero también un recordatorio de lo fácil que es cometer errores. En el caso que estaba manejando ya había personajes escapados y se hizo un gran lío. La respuesta de EJK a continuación fue más útil para mí, una función es probablemente una opción más limpia para muchos :)
jerclarke
1
@jeremyclarke No estoy en desacuerdo, escapar es difícil, evítalo si puedes.
incipiente
¿Necesita ser escapado?
Aaron Franke
88

Aquí hay algo que logra lo mismo sin usar un alias. Ponlo en una función en tu .bashrc:

xx() {
    svn status | awk '$1 =="M"{print $2;}'
}

De esta manera, no tiene que preocuparse por obtener las cotizaciones correctas. Esto usa exactamente la misma sintaxis que usaría en la línea de comando.

EJK
fuente
11
+1, pero una objeción: la functionpalabra clave es una incompatibilidad innecesaria con POSIX. Déjelo apagado:xx() { ...
Charles Duffy
5
No sabía eso. Gracias.
EJK
1
Esto es más simple y me gusta, pero el otro respondió la pregunta con mayor precisión ..
pragmatic_programmer
13
@pragmatic_programmer Esa es una interpretación justa. Personalmente, sigo sosteniendo que esta respuesta es la mejor a pesar de no responder en un sentido literal: al menos el 50% de las veces recibimos preguntas sobre los alias en irc.freenode.org #bash, la respuesta es "use una función en su lugar". ; los alias no pueden hacer nada más que la expansión de prefijos, lo que no es útil si, por ejemplo, desea ramificar los argumentos.
Charles Duffy
7
Hay ocasiones en las que se prefiere mucho más una respuesta literal a la pregunta exacta, pero la mayoría de las veces, una respuesta como esta es mucho más útil porque 1) resuelve el problema inicial de una manera fácil de entender y 2) da la pidiendo una nueva herramienta para su cinturón de herramientas proverbial.
TecBrat
3

Desde Bash 2.04, hay una tercera forma (más fácil) además de usar una función o escapar de la forma en que lo hizo @ffledgling: usando sintaxis literal de cadena ( aquí hay una excelente respuesta ).

Entonces, por ejemplo, si desea crear un alias de este en línea , terminará siendo:

alias snap-removedisabled=$'snap list --all | awk \'$5~"disabled"{print $1" --revision "$3}\' | xargs -rn3 snap remove'

Así que solo tienes que agregar $delante de la cadena y escapar de las comillas simples.

Esto trae una advertencia de shellcheck con la que probablemente podría deshabilitar con# shellcheck disable=SC2139 seguridad .

Pablo Bianchi
fuente