Como criar um alias com um comando contém 'e "

10

Alguns posts atrás, alguém perguntou como mostrar a memória em porcentagem. Alguém respondeu com:

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

Eu queria saber se posso transformar esse comando em um alias em ~ / .bashrc. Mas a sintaxe do alias é:

alias aliasname='command'

Como posso fazer isso? Esse comando contém ambos 'e ". Tentei de maneiras diferentes, mas não funcionou. Isso é possível? Estou esquecendo de algo?

BlackCrystal
fonte
5
Para evitar citar o inferno, pode ser mais fácil definir uma função nesses casos.
nohillside
1
funções @nohillside são geralmente mais útil / poderosa de qualquer maneira
D. Ben Knoble
1
aliasname() { free | awk '/^Mem/ { printf("free: %.2f %\n", $4/$2 * 100.0) }'; }- ainda é apenas uma linha, nenhuma alteração na citação / escape / etc é necessária. Há uma razão pela qual o factid do canal fashode #bash !aliasé (bem, foi , mas durante a maior parte da vida do bot de fatoid é uma variante): Se você precisar perguntar, use uma função .
Charles Duffy

Respostas:

8

Você precisa:

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

Observe que você precisa escapar de ambos "e $.

Arkadiusz Drabczyk
fonte
17

Dizer que a sintaxe de um alias é alias aliasname='command'um pouco enganador, pois parece implicar que as aspas simples fazem parte da sintaxe. Eles não são. A parte após o sinal de igual é semelhante às atribuições de variáveis, na medida em que pode ser qualquer palavra shell , composta por caracteres simples (sem aspas), ou uma string entre aspas, ou uma combinação.

Tudo isso é válido e os três últimos equivalentes:

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

Portanto, tudo que você precisa fazer é escapar das aspas corretamente para tê-las dentro do valor do alias.

Veja, por exemplo, esta resposta e outras respostas para, por exemplo, estas perguntas, para discussão sobre isso:

Ou use a função em vez de um alias para se livrar completamente dos problemas de citação:

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