команда bash alias з одинарними та подвійними лапками


85

У мене є ця команда, яка робить те, що я хочу, але я не можу отримати псевдонім у своєму .bashrc (зауважте, що вона використовує як одинарні, так і подвійні лапки):

svn status | awk '$1 =="M"{print $2;}'

Я пробував:

alias xx="svn status | awk '$1 ==\"M\"{print $2;}'"

І деякі інші поєднання здорового глузду без удачі .. Я знаю, що bash дуже вибагливий у цитатах. То який правильний спосіб його псевдоніма і чому? Дякую

Відповіді:


114

Вам просто потрібно врятуватися від цього правильно.

alias xxx="svn status | awk '\$1 ==\"M\"{print \$2;}'"

16
Тож я не втік від $ .. не знав цього!
pragmatic_programmer

7
Приємно! Я також не знав, що мені доведеться рятуватися від "$"!
Шадоніня

1
Хороша відповідь, але також нагадування про те, як легко робити помилки. У справі, з якою я займався, там вже були втекли персонажі, і це зробило величезну халепу. Відповідь EJK нижче була для мене більш корисною, функція, мабуть, є чистішим варіантом для багатьох :)
jerclarke

1
@jeremyclarke Я не погоджуюсь, втекти важко, уникайте цього, якщо можете.
ffledgling

Чи потрібно врятуватись?
Аарон Франке,

92

Ось те, що виконує те саме, не використовуючи псевдонім. Помістіть його у функцію у своєму .bashrc:

xx() {
    svn status | awk '$1 =="M"{print $2;}'
}

Таким чином, вам не доведеться турбуватися про те, щоб отримати правильні котирування. Тут використовується точно такий же синтаксис, як і в командному рядку.


12
+1, але одна примха - functionключове слово є зайвою несумісністю з POSIX. Просто залиште це:xx() { ...
Чарльз Даффі

5
Я не знаю, що. Дякую.
EJK

2
Це простіше, і мені подобається, але інший відповів на питання точніше ..
pragmatic_programmer

13
@pragmatic_programmer Це справедлива інтерпретація. Особисто я все ще вважаю, що ця відповідь є кращою, незважаючи на те, що вона не реагує буквально - принаймні 50% випадків, коли ми отримуємо запитання щодо псевдонімів у irc.freenode.org #bash, відповідь "використовувати замість цього функцію" ; Псевдоніми не можуть робити нічого, крім розширення префіксу, що не корисно, якщо ви хочете, наприклад, розгалужувати аргументи.
Чарльз Даффі

8
Бувають випадки, коли буквальна відповідь на точне запитання є набагато кращою, але в більшості випадків така відповідь є набагато кориснішою, оскільки вона 1) вирішує початкову проблему легко зрозумілим способом і 2) дає asker новий інструмент для їх прислів'я інструментальної стрічки.
TecBrat 02.03.14

3

Починаючи з Bash 2.04 , є третій (простіший) спосіб, окрім використання функції або виходу з режиму @ffledgling: використання синтаксису рядкового літералу ( ось чудова відповідь ).

Так, наприклад, якщо ви хочете зробити псевдонім цього онлайнера, це в кінцевому підсумку буде:

alias snap-removedisabled=$'snap list --all | awk \'$5~"disabled"{print $1" --revision "$3}\' | xargs -rn3 snap remove'

Отже, вам просто потрібно додати $перед рядком і уникнути одинарних лапок.

Це призводить до shellcheck попередження , ймовірно , можна безпечно відключити з# shellcheck disable=SC2139 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.