Cómo crear un alias con un comando contiene 'y "

10

Hace algunas publicaciones, alguien preguntó cómo mostrar la memoria en porcentaje. Alguien respondió con:

free | awk '/^Mem/ { printf("free: %.2f %\n", $4/$2 * 100.0) }'

Me preguntaba si puedo convertir este comando en un alias en ~ / .bashrc. Pero la sintaxis del alias es:

alias aliasname='command'

¿Cómo puedo hacer esto? Ese comando contiene ambos 'y ". Intenté diferentes formas, pero no funcionó. ¿Es esto posible? ¿Me estoy perdiendo de algo?

Cristal negro
fuente
55
Para evitar citar el infierno, podría ser más fácil definir una función en tales casos.
nohillside
1
Las funciones de @nohillside son generalmente más útiles / poderosas de todos modos
D. Ben Knoble
1
aliasname() { free | awk '/^Mem/ { printf("free: %.2f %\n", $4/$2 * 100.0) }'; }- Todavía solo una línea, no se necesitan cambios en las citas / escape / etc. Hay una razón por la cual el factoid del canal freenode #bash !aliases (bueno, fue , pero durante la mayor parte de la vida del bot factoid alguna variante de): si tiene que preguntar, use una función en su lugar .
Charles Duffy

Respuestas:

8

Necesitas:

alias aliasname="free | awk '/^Mem/ { printf(\"free: %.2f %\n\", \$4/\$2 * 100.0) }'"

Tenga en cuenta que necesita escapar de ambos "y $.

Arkadiusz Drabczyk
fuente
17

Decir que la sintaxis de un alias es alias aliasname='command'un poco engañoso, ya que parece implicar que las comillas simples son parte de la sintaxis. No son. La parte después del signo igual es similar a las asignaciones de variables, ya que puede ser cualquier palabra de shell , compuesta de caracteres simples (sin comillas), o una cadena entre comillas, o una combinación.

Todos estos son válidos, y los tres últimos equivalentes:

alias ks=ls
alias ls='ls -l'
alias ls="ls -l"
alias ls=ls\ -l

Entonces, todo lo que necesita hacer es escapar de las comillas correctamente para tenerlas dentro del valor de alias.

Vea, por ejemplo, esta respuesta y otras respuestas a, por ejemplo, estas preguntas para discutir sobre eso:

O use la función en lugar de un alias para deshacerse de los problemas de citas por completo:

freemem() {
    free | awk '/^Mem/ { printf("free: %.2f %\n", $4/$2 * 100.0) }'
}
ilkkachu
fuente