Beim Versuch, eine einfache Bash-Funktion zu erstellen, tritt der Syntaxfehler in der Nähe des unerwarteten Tokens `(' auf.

Beim Versuch, eine einfache Bash-Funktion zu erstellen, tritt der Syntaxfehler in der Nähe des unerwarteten Tokens `(' auf.

Ich versuche, mein .bash_profile zu ändern, das derzeit wie folgt aussieht:

alias kx="kubectx"
gcreds () {
gcloud container clusters get-credentials $1 --zone $2;
}

wenn ich jedoch versuche, :wq und .bash_profile als Quelle einzugeben (in einem Mac OS X-Terminal), erhalte ich die folgende Fehlermeldung:

bash: .bash_profile: line 14: syntax error near unexpected token `('
-bash: .bash_profile: line 14: `gcreds (){'

ein Kollege hat das gleiche auch getestet (in einem iterm-Terminal) und konnte die Funktion ohne Fehler ausführen

irgendwelche Ideen, was ich falsch machen könnte?

Antwort1

Hypothese: In Ihrer (aber nicht in der Ihres Kollegen) Schale gcredsbefindet sich einaliasdefiniert, bevor die problematische Zeile analysiert wird.

Die Alias-Erweiterung erfolgt früh und ist rein textuell (d. h.gcreds Schnurwird ersetzt durch einigeSchnur, da gibt es keine Logik). Ihre Definition der Funktion wird ungültig, wahrscheinlich weil ()nicht nach dem allerersten Wort steht. Wenn beispielsweise gcredsdurch ersetzt würde, gcreds --somethingwäre es:

gcreds --something () { …

was keine syntaktisch gültige Definition einer Funktion ist. Es kann aber gcredsdurch etwas anderes ersetzt werden:

something-else-than-gcreds whatever and more () { …

Es spielt keine Rolle, was der Ersatz ist. Wichtig ()ist, dass er jetzt am falschen Ort ist.

In Bash können Sie es ausführen, type gcredsum zu sehen, was gcredswirklich ist. Probieren Sie es auch aus type -a gcreds(und help typelernen Sie, was es -atut).

Sie können eine Funktion auch auf alternative Weise definieren, ohne ():

function gcreds { …

Diese Syntax istnicht tragbar. Ich verstehe, dass Sie es darin verwenden werden, ~/.bash_profileda es sich um eine Bash-spezifische Datei handelt, also ist es OK.

Jetzt ist das erste Wort function. Ich gehe davon aus, dass es keinen Alias ​​hat und als Schlüsselwort interpretiert wird (prüfen Sie type function). Wenn das der Fall ist, gcredswird der Alias ​​beim Parsen der Definition nicht erweitert und kann die Definition nicht beschädigen. Auf diese Weise können Sie eine Funktion mit dem Namen definieren gcreds, auch wenn bereits ein Alias ​​vorhanden ist gcreds.

Angenommen, Sie können gcredsAlias ​​und gcredsFunktion definieren. Wenn Sie jetzt ausführen gcreds foo barund Ihr Alias gcreds​​durch ersetzt wird gcreds …, wird der Alias ​​zuerst erweitert, die Funktion wird später ausgeführt. Wenn Ihr Alias ​​jedoch gcredsdurch ersetzt wird something-else-than-gcreds …, wird der Alias ​​zuerst erweitert, die Funktion spielt keine Rolle (eine Funktion mit dem Namen something-else-than-gcredswäre wichtig, falls vorhanden).

Sie brauchen wahrscheinlich keinen AliasUndeine Funktion mit demselben Namen. Wählen Sie eine aus. Wenn Sie beide benötigen, definieren Sie zuerst die Funktion und später den Alias; oder verwenden Sie das Schlüsselwort functionwie oben gezeigt.

verwandte Informationen