Ich möchte einfach einen Alias git-go
fü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.
command-line
bash
alias
Philip Rego
quelle
quelle
Antworten:
Sie tun dies genauso, wie Sie einen Alias festlegen würden.
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
git
Befehl übergebengit 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
: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 Befehlgit-status --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-go
mö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:In der Definition einer Shell - Funktion, die Positionsparameter
$1
,$2
und 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 .
quelle
git-go
in Ihrem PATH und esgit go
wird funktionieren.Sie können es
~/.bash_aliases
wie folgt als Funktion in Ihrer Datei deklarieren :oder Sie können einen Alias in derselben Datei wie folgt erstellen:
Vergessen Sie nicht, Ihr Terminal erneut zu öffnen oder die Datei (
. ~/.bash_aliases
) zu quellen, nachdem Sie sie geändert haben.quelle
Wenn Sie mit
git
Befehlen arbeiten, möchten Sie möglicherweise auch die Syntax zum Hinzufügen eines Alias kennen, insbesondere fürgit
:Dadurch wird Ihrer lokalen
git
Konfiguration (at~/.gitconfig
) ein neuer Alias hinzugefügt, und Sie können Probleme ausgebenwenn in einem
git
Repository. Immer wenn Siegit go
eine Shell ausführen , wird diese aufgerufen und der Befehlgit commit -m "init"; git push; git status
an sie übergeben.Weitere Einzelheiten finden Sie in der Git-Dokumentation .
quelle
Es war ein Zitatproblem. Ich hatte es versucht:
Habe aber diesen Fehler bekommen:
Ich habe diesen Fehler erhalten, weil ich verschachtelte Anführungszeichen falsch verwendet habe. Hier ist die richtige Syntax:
Oder:
Oder ohne Anführungszeichen, wenn in der Festschreibungsnachricht kein Leerzeichen vorhanden ist:
quelle
init
; die Schalen behandelt'init'
,"init"
undinit
die 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 definierengit-go() { git commit -m "init $1"; git push; git status; }
(was ich in meiner Antwort habe, aber mit"init $1"
anstatt nur"$1"
).