Como escapar de aspas simples corretamente criando um alias

Como escapar de aspas simples corretamente criando um alias

Recebi esta linha para saber quanta memória meus processos consomem.

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

Agora gostaria de criar um alias para esse comando, mas tenho um problema ao escapar 'de 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

Tentei escapar das aspas simples, mas ainda assim não funcionou.

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

Você pode me ajudar a entender como criar esse alias?

Responder1

Para tornar isso um alias, o que é possível, você precisa usar aspas duplas em torno de todo o valor do alias. Como resultado, você também precisará escapar de algumas coisas dentro do alias e de qualquer um dos argumentos de campo, pois awkeles também serão interpretados como argumentos pelo Bash quando você definir o alias.

Isso funcionou para mim:

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

Acima eu fiz o seguinte:

  1. Aspas duplas em torno do valor do alias

    alias mm="ps -u ...."
    
  2. Aspas duplas do awk escaparam

    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
    
  3. Campos do awk escapados

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

Eu usaria isso?

Provavelmente não, eu mudaria isso para uma função Bash, pois será mais fácil manter e entender o que está acontecendo, mas aqui está o alias, se você ainda quiser.

Responder2

Você pode me ajudar a entender como criar esse alias?

Posso aconselhá-lo a criar uma função se você usar o bash e colocá-la em .bashrc?

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

Se for bash, as variáveis ​​precisam ser citadas. Em uma função, não há necessidade de colocar tudo em uma linha.

Responder3

Aqui está o comando de escape:

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

Exemplo de aspas de escape no shell:

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

Isso é feito simplesmente finalizando um já aberto ( '), colocando um escapado ( \') e abrindo outro ( ').

Alternativamente:

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

Isso é feito finalizando uma já aberta ( '), colocando aspas em outra ( "'") e abrindo outra ( ').

Relacionado:Como escapar de aspas simples em strings entre aspas simples?no stackoverflow SE

informação relacionada