Wenn ich nicht explizit exit
für bestimmte funktionsbasierte Bash-Skripte anrufe, dann Für einige Funktionen gibt es zusätzliche unerwartete Ausführungen. Was verursacht das? Das Verhalten wurde zuerst bemerkt, als man einen Git Alias als Teil der Beantwortung von Frage eines anderen Benutzers zu StackOverflow . Dieser Alias besteht aus diesem Skript (, das die Funktion zweimal statt einmal ausführt ):
Aber dieses leicht modifizierte Skript wird wie erwartet ausgeführt ( führt die Funktion nur einmal aus ):
%Vor% Hier ist genau das, was passiert, wenn ich diese Skripte über einen Git-Alias ausführen lasse ( hinzugefügt set
Befehl nur für Debugging-Zwecke ):
Die Ausgabe von set -x
:
Die Ausgabe von echo github
durch echo "I am echo in github"
ersetzt den Befehl echo
als Quelle für die zweite Ausführung der Funktion:
Das Folgende ist die einfachste Version des Alias / Skripts, die das unerwünschte Verhalten der doppelten Ausführung ergibt:
%Vor%Und dies ist die resultierende Ausgabe von der Ausführung des vereinfachten Alias / Skripts (, das das falsche Verhalten hat, zweimal auszuführen):
%Vor% Das liegt an der Art, wie git
Alias behandelt:
Gegeben ein Alias
%Vor% Dabei ist string
eine beliebige Zeichenfolge, die Code darstellt, wenn git myalias args
aufgerufen wird, wobei args
eine (möglicherweise leere) Liste von Argumenten ist, wird git
ausgeführt:
Zum Beispiel:
%Vor%und Aufruf
%Vor% git
wird ausgeführt:
und so wird die Ausgabe sein:
%Vor%In Ihrem Fall
%Vor%und Aufruf
%Vor% git
wird ausgeführt:
Lassen Sie mich dies zur besseren Übersichtlichkeit in einer gleichwertigen Form umschreiben:
%Vor% Ich habe nur den 'g(){ echo "once";};;'
Teil (der sh
s
's Positionsparameter ist und hier keine Rolle spielt) durch ein Dummy Argument -
git
ersetzt. Es sollte klar sein, dass es ist wie Ausführen:
Sie werden sehen:
%Vor%Um das zu beheben: benutze keine Parameter! benutze einfach:
%Vor%Wenn Sie nun wirklich Parameter verwenden wollen, stellen Sie sicher, dass die folgenden Parameter nicht ausgeführt werden. Eine Möglichkeit besteht darin, ein abschließendes Kommentarzeichen wie folgt hinzuzufügen:
%Vor%Für Ihr vollständiges Beispiel könnte eine sauberere Methode auch sein, alles in eine Funktion zu packen:
%Vor% Hoffentlich hast du verstanden, was "$@"
unter der Haube mit Aliasen macht! Es hängt sh -c
an die Alias-Zeichenfolge an und ruft %code% mit dieser Zeichenfolge und den angegebenen Argumenten auf.
Die Frage wurde bereits von gniourf_gniourf beantwortet, also habe ich eine Version des vereinfachten Alias / Skriptes erstellt funktioniert so, wie ich es ursprünglich geplant habe. Da dies technisch eine Antwort und nicht wirklich Teil der Frage ist, habe ich dies als Antwort hinzugefügt. Diese Antwort ergänzt die andere Antwort von gniourf_gniourf und ist nicht dazu gedacht, der korrekten Antwort einen Kredit zu entziehen.
> Diese fixierte Version des vereinfachten Skripts führt entweder eine gefundene Funktion aus oder gibt gar nichts aus, und die Tatsache, dass Git #@
am Ende des Skripts platziert, wird durch den Zusatz eines Kommentars am Ende von korrigiert das Skript. Dies ist eine feste Version des vereinfachten Skripts (, die das korrekte Ausführungsverhalten bei einmaliger Ausführung angibt):
Hier ist die Ausgabe dieser korrigierten Version des vereinfachten Alias / Skriptes (, das das korrekte Verhalten hat: einmal ausführen und nichts für unbekannte Eingabe anzeigen ):
%Vor% Die Quintessenz ist, dass Git Aliase verarbeitet (siehe gniourf_gniourfs Antwort , um eine Erklärung dafür zu erhalten). Sie müssen die Problemumgehung umgehen, dass $@
an das Ende Ihres Alias / script angehängt wird.