Cómo escapar de las comillas simples creando correctamente un alias

Cómo escapar de las comillas simples creando correctamente un alias

Me dieron esta frase para saber cuánta memoria consumen mis procesos.

$ ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'

Ahora me gustaría crear un alias para ese comando, pero tengo problemas para escapar 'de los caracteres:

$ alias mm=ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
bash: alias: -u: not found
bash: alias: myuser: not found
bash: alias: -o: not found
bash: alias: pid,rss,command: not found
Total 0 MB

Intenté escapar de las comillas simples, pero aún así no funciona.

$ alias mm='ps -u $USER -o pid,rss,command | \
    awk \'{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}\''
> 

¿Puedes ayudarme a entender cómo crear este alias?

Respuesta1

Para convertirlo en un alias, lo cual es posible, debe utilizar comillas dobles alrededor del valor completo del alias. Como resultado, también necesitarás escapar de algunas cosas dentro del alias, y deberás escapar de cualquiera de los argumentos de campo, awkya que Bash también los interpretará como argumentos cuando estés configurando el alias.

Esto funcionó para mí:

$ alias mm="ps -u $USER -o pid,rss,command | \
    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}'"

En lo anterior he hecho lo siguiente:

  1. Comillas dobles alrededor del valor del alias

    alias mm="ps -u ...."
    
  2. Se escaparon las comillas dobles de awk

    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
    
  3. Escapó de los campos de awk

    awk '{print \$0}{sum+=\$2} END
    

¿Usaría esto?

Probablemente no, cambiaría esto a una función Bash, ya que será más fácil de mantener y comprender lo que está pasando, pero aquí está el alias si aún lo desea.

Respuesta2

¿Puedes ayudarme a entender cómo crear este alias?

¿Puedo aconsejarle que cree una función si usa bash y la coloca en .bashrc?

mm() {
  ps -u "$USER" -o pid,rss,command |
    awk '{print $0}{sum+=$2}
         END {print "Total", sum/1024, "MB"}'
}

Si es así bash, es necesario citar las variables. En una función, no es necesario poner todo en una sola línea.

Respuesta3

Aquí está el comando escapado:

alias mm='ps -u $USER -o pid,rss,command | \
    awk '\''{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'\'

Ejemplo de comillas de escape en Shell:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Simplemente se hace terminando uno ya abierto ( '), colocando uno escapado ( \') y luego abriendo otro ( ').

Alternativamente:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Se hace terminando uno ya abierto ( '), colocando comillas entre comillas ( "'") y luego abriendo otro ( ').

Relacionado:¿Cómo escapar de comillas simples dentro de cadenas entre comillas simples?en stackoverflow SE

información relacionada