Wie setze ich einen Alias ​​für eine Terminalleitung?


9

Ich möchte einfach einen Alias git-gofür diese Terminalleitung festlegen :

git commit -m "init "; git push; git status

Wenn ich also git-go eingebe, sollte diese Zeile eintreten.

Wie kann ich das machen? Die Antworten, die ich gesehen habe, decken nur den Alias ​​eines Befehls ohne Parameter ab. Aber ich möchte einen Alias ​​für eine beliebige Endleitung setzen.


Was hast du versucht? Welche anderen Fragen haben Sie gelesen? askubuntu.com/q/17536/507051 erklärt es ganz gut, was genau ist deine Frage?
Dessert

Mein Problem war die Verwendung von doppelten Anführungszeichen anstelle von einfachen Anführungszeichen für die externen Anführungszeichen.
Philip Rego

Sie können es auch umgekehrt machen, indem Sie außen doppelte Anführungszeichen und innen einfache Anführungszeichen verwenden.
Videonauth

Antworten:


13

Sie tun dies genauso, wie Sie einen Alias ​​festlegen würden.

alias git-go='git commit -m "init "; git push; git status'

Die Situation, in der es schwierig wird, ist nicht, wenn ein Alias ​​einen Befehl ausführt und Argumente an diesen Befehl übergibt, noch wenn ein Alias ​​mehrere Befehle getrennt durch ausführt ;, sondern wenn ein Alias ​​seine eigenen Befehlszeilenargumente akzeptieren und verwenden soll .

Beispielsweise wird alles, was Sie nach dem Namen dieses Alias schreiben, am Ende eingefügt und anschließend als Befehlszeilenargument an den dritten gitBefehl übergeben git status. (Es ist wirklich nicht so sehr so, dass der folgende Text am Ende eingefügt wird, sondern vielmehr, dass der folgende Text in Ruhe gelassen wird und der Aliasname durch seine Definition ersetzt wird.)

Sie können Ihren Alias ​​also ohne Argumente ausführen, was funktioniert. Der letzte Befehl lautet git status:

git-go

Oder Sie können es mit Argumenten ausführen, an die Sie übergeben möchten git status. Wenn Sie es beispielsweise auf diese Weise ausführen, lautet der letzte Befehl git-status --show-stash:

git-go --show-stash

Mit einem Alias ​​in Bash (und anderen Shells im Bourne-Stil) können Sie nicht festlegen, dass der Alias ​​Befehlszeilenargumente akzeptiert und an einer anderen Stelle als am Ende platziert.

Angenommen, Sie git-gomöchten ein Argument akzeptieren, das für die Festschreibungsnachricht verwendet wird. Sie können dies nicht als Alias ​​schreiben. Die Lösung wäre, es stattdessen als Shell-Funktion zu schreiben:

git-go() { git commit -m "$1"; git push; git status; }

In der Definition einer Shell - Funktion, die Positionsparameter $1, $2und so halten weiter die Werte der Befehlszeilenargumente an die Shell - Funktion übergeben. Aliase haben keine entsprechende Funktionalität, da die Aliaserweiterung eine Form der Makroverarbeitung ist, die sehr früh stattfindet, wenn die Shell einen Befehl analysiert.

Sie können es natürlich auch als Shell-Funktion schreiben, auch wenn Sie in der Definition keine Positionsparameter verwenden müssen, wie Videonauth vorschlägt .


1
Noch besser: Platzieren Sie ein Skript mit dem Namen git-goin Ihrem PATH und es git gowird funktionieren.
D. Ben Knoble

10

Sie können es ~/.bash_aliaseswie folgt als Funktion in Ihrer Datei deklarieren :

git-go(){
    git commit -m "init "
    git push
    git status
}

oder Sie können einen Alias ​​in derselben Datei wie folgt erstellen:

alias git-go='git commit -m "init "; git push; git status'

Vergessen Sie nicht, Ihr Terminal erneut zu öffnen oder die Datei ( . ~/.bash_aliases) zu quellen, nachdem Sie sie geändert haben.


1
Ein Vorteil des Schreibens einer Shell-Funktion anstelle eines Alias ​​besteht darin, dass keine Anführungszeichen verschachtelt werden müssen. Diese Antwort spricht somit das zentrale Problem an, das das OP direkter als mein Problem hatte .
Eliah Kagan

@EliahKagan Beide sind in Ordnung für diese Frage, obwohl deine mehr ist. Schön dich wieder zu sehen.
Videonauth

4

Wenn Sie mit gitBefehlen arbeiten, möchten Sie möglicherweise auch die Syntax zum Hinzufügen eines Alias ​​kennen, insbesondere für git:

git config --global alias.go '!sh -c "git commit -m \"init\"; git push; git status"'

Dadurch wird Ihrer lokalen gitKonfiguration (at ~/.gitconfig) ein neuer Alias ​​hinzugefügt, und Sie können Probleme ausgeben

git go

wenn in einem gitRepository. Immer wenn Sie git goeine Shell ausführen , wird diese aufgerufen und der Befehl git commit -m "init"; git push; git statusan sie übergeben.

Weitere Einzelheiten finden Sie in der Git-Dokumentation .


3

Es war ein Zitatproblem. Ich hatte es versucht:

alias="git commit -m "init "; git push; git status"

Habe aber diesen Fehler bekommen:

bash: ; git push; git status: command not found

Ich habe diesen Fehler erhalten, weil ich verschachtelte Anführungszeichen falsch verwendet habe. Hier ist die richtige Syntax:

alias='git commit -m "init "; git push; git status'

Oder:

alias="git commit -m 'init '; git push; git status"

Oder ohne Anführungszeichen, wenn in der Festschreibungsnachricht kein Leerzeichen vorhanden ist:

alias="git commit -m init; git push; git status"

Vielen Dank, dass Sie diese Antwort veröffentlicht haben (da sich meine Antwort und die von Videonauth nicht sehr auf das Zitierproblem konzentrieren). Warum wollten Sie aus Neugier ein Leerzeichen in Ihren Commit-Nachrichten?
Eliah Kagan

Früher habe ich diese Zeile manuell eingefügt und nach dem Leerzeichen eine Nachricht hinzugefügt, aber das macht hier keinen Sinn, also habe ich sie herausgenommen.
Philip Rego

1
In diesem Fall brauchen Sie nicht zu zitieren init; die Schalen behandelt 'init', "init"und initdie gleiche. (Daher möchten Sie möglicherweise die Originalversion zurücksetzen und auch die neue Version anzeigen, um die Situation zu veranschaulichen, in der verschachtelte Anführungszeichen erforderlich sind.) Um den Rest der Nachricht hinzufügen zu können, können Sie diese als Befehlszeile übergeben Argument, wenn Sie (wie in Videonauths und meinen Antworten gezeigt) eine Funktion anstelle eines Alias ​​definiert haben. Zum Beispiel könnten Sie definieren git-go() { git commit -m "init $1"; git push; git status; }(was ich in meiner Antwort habe, aber mit "init $1"anstatt nur "$1").
Eliah Kagan

Danke, das wollte ich als nächstes versuchen.
Philip Rego
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.