bash alias polecenie z pojedynczymi i podwójnymi cudzysłowami

85

Mam to polecenie, które robi to, co chcę, ale nie mogę uzyskać aliasu w moim .bashrc (zauważ, że używa zarówno pojedynczych, jak i podwójnych cudzysłowów):

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

Próbowałem:

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

I kilka innych zdroworozsądkowych kombinacji bez powodzenia… Wiem, że bash jest bardzo wybredny w cudzysłowach. Więc jak należy go nazwać i dlaczego? Dzięki

pragmatic_programmer
źródło

Odpowiedzi:

114

Musisz tylko poprawnie uciec.

alias xxx="svn status | awk '\$1 ==\"M\"{print \$2;}'"
ffledgling
źródło
16
Więc nie uciekłem przed $… nie wiedziałem tego!
pragmatic_programmer
7
Miły! Nie wiedziałem też, że muszę uciec od „$”!
Shadoninja
1
Dobra odpowiedź, ale też przypomnienie, jak łatwo popełniać błędy. W przypadku, którym się zajmowałem, były już uciekłe postacie i narobił to ogromnego bałaganu. Odpowiedź EJK poniżej była dla mnie bardziej przydatna, funkcja jest prawdopodobnie czystszą opcją dla wielu :)
jerclarke
1
@jeremyclarke Nie zgadzam się, ucieczka jest trudna, unikaj tego, jeśli możesz.
ffledgling
Czy trzeba uciec?
Aaron Franke,
92

Oto coś, co daje to samo bez użycia aliasu. Umieść to w funkcji w swoim .bashrc:

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

W ten sposób nie musisz się martwić, że cytaty są prawidłowe. Używa dokładnie tej samej składni, co w wierszu poleceń.

EJK
źródło
13
+1, ale jedno zastrzeżenie - functionsłowo kluczowe jest niepotrzebną niekompatybilnością z POSIX. Po prostu zostaw to:xx() { ...
Charles Duffy
6
Nie wiedziałem tego. Dzięki.
EJK
3
To jest prostsze i mi się podoba, ale ten drugi odpowiedział na pytanie dokładniej ..
pragmatic_programmer
14
@pragmatic_programmer To uczciwa interpretacja. Osobiście nadal uważam, że ta odpowiedź jest lepsza, mimo że nie odpowiada w sensie dosłownym - co najmniej w 50% przypadków, gdy otrzymujemy pytania o aliasy w irc.freenode.org #bash, odpowiedź brzmi „zamiast tego użyj funkcji” ; aliasy nie mogą nic zrobić poza rozwijaniem przedrostków, co nie jest przydatne, jeśli chcesz na przykład rozgałęziać się na argumentach.
Charles Duffy
9
Są chwile, kiedy dosłowna odpowiedź na dokładne pytanie jest znacznie bardziej preferowana, ale w większości przypadków taka odpowiedź jest znacznie bardziej pomocna, ponieważ 1) rozwiązuje początkowy problem w łatwy do zrozumienia sposób i 2) daje asker nowe narzędzie do przysłowiowego paska narzędzi.
TecBrat
3

Od Bash 2.04 istnieje trzeci (łatwiejszy) sposób, poza używaniem funkcji lub ucieczką, jak to zrobił @ffledgling: użycie składni literału ciągu ( tutaj jest doskonała odpowiedź ).

Na przykład, jeśli chcesz utworzyć alias tego użytkownika online , skończy się to na:

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

Musisz więc tylko dodać $ przed ciągiem i uciec przed pojedynczymi cudzysłowami.

Powoduje to ostrzeżenie o sprawdzaniu powłoki, które prawdopodobnie można bezpiecznie wyłączyć za pomocą# shellcheck disable=SC2139 .

Pablo Bianchi
źródło