.bash_profile:第 260 行:意外標記「(」附近出現語法錯誤

.bash_profile:第 260 行:意外標記「(」附近出現語法錯誤

我有 bash 函數:

WORKING_REACT_EXAMPLES="$HOME/tutorials/javascript/react/working-react-examples"
dualpush() { cd $WORKING_REACT_EXAMPLES; cmpushall "$1"; cd ..; cmpushall $1; cd $WORKING_REACT_EXAMPLES ;}

它看起來與我的其他功能類似。當我嘗試獲取 .bashrc 來源時,我得到

$ src
-bash: /Users/cchilders/.bash_profile: line 260: syntax error near unexpected token `('
-bash: /Users/cchilders/.bash_profile: line 260: `dualpush() { cd $WORKING_REACT_EXAMPLES; cmpushall "$1"; cd ..; cmpushall "$1"; cd $WORKING_REACT_EXAMPLES ;}'

Shellcheck 警告要雙引號某些內容,但沒有說任何錯誤,所以我這樣做

dualpush() { cd "$WORKING_REACT_EXAMPLES"; cmpushall "$1"; cd ..; cmpushall "$1"; cd "$WORKING_REACT_EXAMPLES" ;}

並得到同樣的錯誤

是什麼導致了語法錯誤?謝謝

答案1

當函數名稱已經定義為別名帶參數。

別名替換發生在 shell 解析的早期,因此它也會影響函數宣告(以及其他事情)。例如,如果您有以下內容...

alias dualpush="push; push --again"

dualpush() { push; push --again; }

……然後它將擴展到:

push; push --again() { push; push --again; }

如果原始別名以命令結尾沒有參數,事情仍然有效,但函數定義在錯誤的名稱下(其中其他潛在的驚喜! )。但是,如果該別名中的最後一個命令某些參數,則擴展不再被識別為函數聲明 - 而是出現()在命令列參數的中間並被解析器拒絕。

答案2

關閉終端機後,完全相同的命令將起作用。 Mac 在使用 bash 函數時有缺陷,在註解掉 bashrc 後dualpush,它仍然保留在終端中。重新啟動整個終端,相同的命令有效。我不理解這種糟糕的行為,但是在 ubuntu 上這不會發生在我身上

相關內容