Befehl bash alias mit einfachen und doppelten Anführungszeichen

81

Ich habe diesen Befehl, der macht, was ich will, aber ich kann ihn in meiner .bashrc nicht aliasen (beachten Sie, dass er sowohl einfache als auch doppelte Anführungszeichen verwendet):

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

Ich habe es versucht:

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

Und einige andere vernünftige Kombinationen ohne Glück. Ich weiß, dass Bash mit Anführungszeichen sehr wählerisch ist. Also, wie kann man es richtig aliasen und warum? Vielen Dank

pragmatischer_Programmierer
quelle

Antworten:

108

Sie müssen es nur richtig entkommen.

alias xxx="svn status | awk '\$1 ==\"M\"{print \$2;}'"
flügge
quelle
16
Also bin ich dem $ nicht entkommen ... wusste das nicht!
pragmatic_programmer
7
Nett! Ich wusste auch nicht, dass ich dem '$' entkommen musste!
Shadoninja
1
Gute Antwort, aber auch eine Erinnerung daran, wie einfach es ist, Fehler zu machen. In dem Fall, den ich handhabte, gab es bereits entkommene Charaktere und es machte ein großes Durcheinander. EJKs Antwort unten war für mich nützlicher, eine Funktion ist wahrscheinlich eine sauberere Option für viele :)
Jerclarke
1
@jeremyclarke Ich bin nicht anderer Meinung, Flucht ist schwer, vermeiden Sie es, wenn Sie können.
Jungvogel
Muss man entkommen?
Aaron Franke
88

Hier ist etwas, das dasselbe erreicht, ohne einen Alias ​​zu verwenden. Fügen Sie es in eine Funktion in Ihrer .bashrc ein:

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

Auf diese Weise müssen Sie sich keine Sorgen machen, dass die Angebote genau richtig sind. Dies verwendet genau die gleiche Syntax wie in der Befehlszeile.

EJK
quelle
11
+1, aber ein Streitpunkt - das functionSchlüsselwort ist eine unnötige Inkompatibilität mit POSIX. Lass es einfach aus:xx() { ...
Charles Duffy
5
Das wusste ich nicht. Vielen Dank.
EJK
1
Das ist einfacher und ich mag es, aber der andere hat die Frage genauer beantwortet.
pragmatic_programmer
13
@pragmatic_programmer Das ist eine faire Interpretation. Persönlich bin ich immer noch der Meinung, dass diese Antwort die bessere ist, obwohl sie nicht im wahrsten Sinne des Wortes reagiert. In mindestens 50% der Fälle #bash, in denen wir Fragen zu Aliasnamen in irc.freenode.org erhalten , lautet die Antwort "Verwenden Sie stattdessen eine Funktion". ;; Aliase können nur eine Präfixerweiterung ausführen, was nicht hilfreich ist, wenn Sie beispielsweise nach Argumenten verzweigen möchten.
Charles Duffy
7
Es gibt Zeiten, in denen eine wörtliche Antwort auf die genaue Frage viel bevorzugter ist, aber meistens ist eine Antwort wie diese viel hilfreicher, weil sie 1) das anfängliche Problem auf leicht verständliche Weise löst und 2) das ergibt Fragen Sie ein neues Werkzeug für ihren sprichwörtlichen Werkzeuggürtel.
TecBrat
3

Seit Bash 2.04 gibt es neben der Verwendung einer Funktion oder der Flucht vor @ffledgling einen dritten (einfacheren) Weg: die Verwendung der String-Literal-Syntax ( hier eine hervorragende Antwort ).

Wenn Sie beispielsweise einen Alias ​​für diesen Onliner erstellen möchten, lautet dieser:

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

Sie müssen also nur das $vor der Zeichenfolge einfügen und die einfachen Anführungszeichen umgehen.

Dies bringt eine shellcheck Warnung Sie wahrscheinlich sicher deaktivieren könnte mit# shellcheck disable=SC2139 .

Pablo Bianchi
quelle