Warum wird diese Bash-Funktion innerhalb eines Git-Alias ​​zweimal ausgeführt, und warum wird durch das Hinzufügen von 'exit' das behoben?

8

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 ):

%Vor%

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 ):

%Vor%

Die Ausgabe von set -x :

%Vor%

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:

%Vor%

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%     
Emily Mabrey 14.12.2016, 20:27
quelle

2 Antworten

11

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:

%Vor%

Zum Beispiel:

%Vor%

und Aufruf

%Vor%

git wird ausgeführt:

%Vor%

und so wird die Ausgabe sein:

%Vor%

In Ihrem Fall

%Vor%

und Aufruf

%Vor%

git wird ausgeführt:

%Vor%

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:

%Vor%

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.

    
gniourf_gniourf 23.12.2016, 18:01
quelle
2

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):

%Vor%

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.

    
Emily Mabrey 23.12.2016 22:27
quelle

Tags und Links