尝试创建一个简单的 bash 函数,但在意外的标记“(”附近出现语法错误

尝试创建一个简单的 bash 函数,但在意外的标记“(”附近出现语法错误

我正在尝试修改我的 .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 --somethingthen ,则将是:

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您也可以定义一个名为 的函数。gcredsgcreds

假设您设法定义了gcreds别名和gcreds函数。现在,如果您运行gcreds foo bar并且您的别名替换gcredsgcreds …,那么别名将首先展开,函数将稍后执行。但是,如果您的别名替换gcreds为,something-else-than-gcreds …那么别名将首先展开,函数将无关紧要(如果有的话,名为的函数something-else-than-gcreds将很重要)。

你可能不需要别名同名函数。选一个。如果确实需要两者,请先定义函数,然后再定义别名;或者使用function如上所示的关键字。

相关内容