Ich bin gerade auf etwas Ähnliches gestoßen; Ich hoffe, es ist OK, meine Notizen zu posten. Eine Sache, die mich über git
Aliase mit Argumenten verwirrt , kommt wahrscheinlich von git help config
(ich habe Git-Version 1.7.9.5):
Wenn der Alias-Erweiterung ein Ausrufezeichen vorangestellt wird, wird sie als Shell-Befehl behandelt. Wenn Sie beispielsweise "alias.new =! Gitit --all --not ORIG_HEAD" definieren, entspricht der Aufruf "git new" dem Ausführen des Shell-Befehls "gitk --all --not ORIG_HEAD". Beachten Sie, dass Shell-Befehle aus dem Verzeichnis der obersten Ebene eines Repositorys ausgeführt werden, das nicht unbedingt das aktuelle Verzeichnis sein muss. [...]
So wie ich es sehe - wenn ein Alias "als Shell-Befehl behandelt wird", wenn ein Ausrufezeichen vorangestellt wird - warum sollte ich eine Funktion oder sh -c
Argumente verwenden müssen? Warum schreibst du meinen Befehl nicht einfach so wie er ist?
Ich weiß die Antwort immer noch nicht - aber ich denke tatsächlich, dass es einen kleinen Unterschied im Ergebnis gibt. Hier ist ein kleiner Test - werfen Sie diesen in Ihren .git/config
oder Ihren ~/.gitconfig
:
[alias]
# ...
ech = "! echo rem: "
shech = "! sh -c 'echo rem:' "
fech = "! f() { echo rem: ; }; f " # must have ; after echo!
echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "
Folgendes bekomme ich, um diese Aliase auszuführen:
$ git ech word1 word2
rem: word1 word2
$ git shech word1 word2
rem:
$ git fech word1 word2
rem:
$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2
$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/
... oder: Wenn Sie einen "einfachen" Befehl nach dem !
"wie besehen " in einem git
Alias git
verwenden, wird die Argumentliste automatisch an diesen Befehl angehängt! Eine Möglichkeit, dies zu vermeiden, besteht darin, Ihr Skript entweder als Funktion oder als Argument für aufzurufen sh -c
.
Eine andere interessante Sache hier (für mich) ist, dass man in einem Shell-Skript normalerweise erwartet, dass die automatische Variable $0
der Dateiname des Skripts ist. Bei einer git
Alias-Funktion ist das $0
Argument im Grunde genommen der Inhalt der gesamten Zeichenfolge, die diesen Befehl angibt (wie in der Konfigurationsdatei eingegeben).
Aus diesem Grund, denke ich, wenn Sie zufällig falsch zitieren - im folgenden Fall würde dies den äußeren doppelten Anführungszeichen entgehen:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - dann git
würde mit (zumindest für mich) etwas kryptischer Nachricht scheitern:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
Ich denke, da git
eine ganze Zeichenfolge nur als ein Argument "gesehen" wurde !
, wurde versucht, sie als ausführbare Datei auszuführen. und dementsprechend konnte es nicht "echo 'A' 'B'"
als Datei gefunden werden.
In jedem Fall git help config
würde ich im Zusammenhang mit dem obigen Zitat spekulieren, dass es genauer ist, Folgendes anzugeben : " ... der Aufruf" git new "entspricht dem Ausführen des Shell-Befehls" gitk --all --not ORIG_HEAD " $ @ ", wobei $ @ die Argumente sind, die zur Laufzeit von der Befehlszeile an den git-Befehlsalias übergeben werden. ... ". Ich denke, das würde auch erklären, warum der "direkte" Ansatz in OP nicht mit Positionsparametern funktioniert.
$1
sollte funktionieren).