我正在尝试修改我的 .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
then ,则将是:
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
如上所示的关键字。