Как создать псевдоним с помощью команды, содержащей 'и "

10

Несколько постов назад кто-то спросил, как показать память в процентах. Кто-то ответил:

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

Мне было интересно, смогу ли я превратить эту команду в псевдоним в ~ / .bashrc. Но синтаксис псевдонима:

alias aliasname='command'

Как я могу это сделать? Эта команда содержит 'и ". Я пробовал разные способы, но это не сработало. Это вообще возможно? Я что-то упускаю?

BlackCrystal
источник
5
Чтобы избежать кавычек, в таких случаях было бы проще просто определить функцию.
Nohillside
1
Функции @nohillside обычно более полезны / мощны в любом случае
D. Ben Knoble
1
aliasname() { free | awk '/^Mem/ { printf("free: %.2f %\n", $4/$2 * 100.0) }'; }- все еще только одна строка, никаких изменений в цитировании / экранировании / и т.д. не требуется вообще. Есть причина, по которой фактоид канала freenode !alias#bash (ну, был , но для большей части жизни фактоида бота какой-то вариант): если вам нужно спросить, используйте вместо этого функцию .
Чарльз Даффи

Ответы:

8

Тебе нужно:

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

Обратите внимание, что вам нужно сбежать как "и $.

Аркадиуш Драбчик
источник
17

Утверждение, что синтаксис псевдонима alias aliasname='command'немного вводит в заблуждение, так как кажется, подразумевает, что одинарные кавычки являются частью синтаксиса. Они не. Часть после знака равенства аналогична присваиванию переменных в том смысле, что это может быть любое слово оболочки , состоящее из простых символов (без кавычек), строки в кавычках или комбинации.

Все они действительны, и последние три эквивалента:

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

Итак, все, что вам нужно сделать, это правильно выйти из кавычек, чтобы они были внутри значения псевдонима.

См., Например, этот ответ и другие ответы, например, на этот вопрос для обсуждения по этому вопросу:

Или используйте функцию вместо псевдонима, чтобы полностью избавиться от проблем с цитированием:

freemem() {
    free | awk '/^Mem/ { printf("free: %.2f %\n", $4/$2 * 100.0) }'
}
ilkkachu
источник