
我正在嘗試修改我的 .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
。我假設它沒有別名,並且被解釋為關鍵字( check type function
)。如果是這樣,gcreds
解析定義時不會擴展別名,也不會破壞定義。這樣gcreds
,即使已經有別名,您也可以定義名為 的函數gcreds
。
假設您設法定義gcreds
別名和gcreds
函數。現在,如果您運行gcreds foo bar
並且別名替換gcreds
為gcreds …
,則別名將首先擴展,該函數將稍後執行。但是,如果您的別名替換gcreds
為,something-else-than-gcreds …
那麼別名將首先擴展,該函數並不重要(名為的函數something-else-than-gcreds
很重要,如果有的話)。
您可能不需要別名和具有相同名稱的函數。選一個。如果您確實需要兩者,請先定義函數,然後再定義別名;或使用function
如上所示的關鍵字。