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

Respuestas:


108

Solo necesitas escapar correctamente.

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

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.


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 .

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.