我有 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 上這不會發生在我身上