Comment créer un alias avec une commande contient 'et "

10

Il y a quelques articles, quelqu'un a demandé comment afficher la mémoire en pourcentage. Quelqu'un a répondu:

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

Je me demandais si je pouvais transformer cette commande en alias dans ~ / .bashrc. Mais la syntaxe de l'alias est:

alias aliasname='command'

Comment puis-je faire ceci? Cette commande contient à la fois 'et ". J'ai essayé différentes manières, mais cela n'a pas fonctionné. Est-ce seulement possible? Suis-je en train de manquer quelque chose?

BlackCrystal
la source
5
Pour éviter de citer l'enfer, il pourrait être plus facile de simplement définir une fonction dans de tels cas.
nohillside
1
Les fonctions @nohillside sont généralement plus utiles / puissantes de toute façon
D. Ben Knoble
1
aliasname() { free | awk '/^Mem/ { printf("free: %.2f %\n", $4/$2 * 100.0) }'; }- toujours une seule ligne, aucun changement de citation / échappement / etc nécessaire du tout. Il y a une raison pour laquelle le factoid du canal freenode #bash !aliasest (enfin, était , mais pour la plupart de la vie du bot factoid, une variante de): Si vous devez demander, utilisez plutôt une fonction .
Charles Duffy

Réponses:

8

Vous avez besoin:

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

Notez que vous devez échapper à la fois à "et $.

Arkadiusz Drabczyk
la source
17

Dire que la syntaxe d'un alias est alias aliasname='command'un peu trompeur, car cela semble impliquer que les guillemets simples font partie de la syntaxe. Ils ne sont pas. La partie après le signe égal est similaire aux affectations de variables, en ce sens qu'elle peut être n'importe quel mot shell , composé soit de caractères simples (sans guillemets), soit d'une chaîne entre guillemets, soit d'une combinaison.

Ce sont tous valides, et les trois derniers équivalents:

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

Donc, tout ce que vous devez faire est d'échapper correctement les guillemets pour les avoir dans la valeur d'alias.

Voir, par exemple, cette réponse et d'autres réponses, par exemple, ces questions pour une discussion à ce sujet:

Ou utilisez la fonction au lieu d'un alias pour vous débarrasser complètement des problèmes de citation:

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