嘗試建立一個簡單的 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_profileBash 特定文件中使用它,所以沒問題。

現在第一個字是function。我假設它沒有別名,並且被解釋為關鍵字( check type function)。如果是這樣,gcreds解析定義時不會擴展別名,也不會破壞定義。這樣gcreds,即使已經有別名,您也可以定義名為 的函數gcreds

假設您設法定義gcreds別名和gcreds函數。現在,如果您運行gcreds foo bar並且別名替換gcredsgcreds …,則別名將首先擴展,該函數將稍後執行。但是,如果您的別名替換gcreds為,something-else-than-gcreds …那麼別名將首先擴展,該函數並不重要(名為的函數something-else-than-gcreds很重要,如果有的話)。

您可能不需要別名具有相同名稱的函數。選一個。如果您確實需要兩者,請先定義函數,然後再定義別名;或使用function如上所示的關鍵字。

相關內容