Пытаюсь создать простую функцию bash, но получаю синтаксическую ошибку около неожиданного токена `(' error

Пытаюсь создать простую функцию bash, но получаю синтаксическую ошибку около неожиданного токена `(' error

Я пытаюсь изменить свой .bash_profile, который в настоящее время выглядит так:

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

Однако когда я пытаюсь выполнить :wq и source .bash_profile (в терминале Mac OS X), я получаю следующее сообщение об ошибке:

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

коллега также протестировал то же самое (в терминале iterm) и смог запустить функцию без ошибок

есть идеи, что я могу делать неправильно?

решение1

Гипотеза: В вашей (но не в вашей коллеги) оболочке gcredsестьпсевдонимопределяется до анализа проблемной строки.

Расширение псевдонима происходит рано и является чисто текстовым (т.е.gcreds нитьзаменяется некоторыминить, логики нет). Ваше определение функции становится недействительным, вероятно, потому что ()не находится после самого первого слова. Например, если gcredsбыло заменено на gcreds --somethingто это будет:

gcreds --something () { …

что не является синтаксически допустимым определением функции. Но его можно gcredsзаменить чем-то другим:

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

Неважно, что это за замена. Важно то, ()что сейчас не на том месте.

В Bash можно запустить, type gcredsчтобы увидеть, что gcredsна самом деле есть. Также попробовать type -a gcredshelp typeузнать, что -aделает).

Вы можете определить функцию альтернативным способом, без ():

function gcreds { …

Этот синтаксисне переносимый. Я понимаю, что вы собираетесь использовать его внутри ~/.bash_profileспецифичного для Bash файла, так что все в порядке.

Теперь первое слово — function. Я предполагаю, что оно не псевдоним и интерпретируется как ключевое слово (проверьте type function). Если это так, gcredsпсевдоним не раскрывается при разборе определения, он не может нарушить определение. Таким образом, вы можете определить функцию с именем gcreds, даже если уже есть gcredsпсевдоним.

Предположим, вам удалось определить gcredsпсевдоним и gcredsфункцию. Теперь, если вы запустите gcreds foo barи ваш псевдоним заменит gcredsна gcreds …, то псевдоним будет расширен первым, функция будет выполнена позже. Но если ваш псевдоним заменит gcredsна something-else-than-gcreds …, то псевдоним будет расширен первым, функция не будет иметь значения (имя функции something-else-than-gcredsбудет иметь значение, если оно есть).

Вам, вероятно, не нужен псевдоним.ифункция с тем же именем. Выберите одну. Если вам нужны обе, сначала определите функцию, а псевдоним — позже; или используйте ключевое слово, functionкак показано выше.

Связанный контент