
Я пытаюсь изменить свой .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 gcreds
(и help 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
как показано выше.