
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 gcreds
befindet 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 gcreds
durch ersetzt würde, gcreds --something
wäre es:
gcreds --something () { …
was keine syntaktisch gültige Definition einer Funktion ist. Es kann aber gcreds
durch 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 gcreds
um zu sehen, was gcreds
wirklich ist. Probieren Sie es auch aus type -a gcreds
(und help type
lernen Sie, was es -a
tut).
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_profile
da 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, gcreds
wird 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 gcreds
Alias und gcreds
Funktion definieren. Wenn Sie jetzt ausführen gcreds foo bar
und Ihr Alias gcreds
durch ersetzt wird gcreds …
, wird der Alias zuerst erweitert, die Funktion wird später ausgeführt. Wenn Ihr Alias jedoch gcreds
durch ersetzt wird something-else-than-gcreds …
, wird der Alias zuerst erweitert, die Funktion spielt keine Rolle (eine Funktion mit dem Namen something-else-than-gcreds
wä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 function
wie oben gezeigt.