.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 ;}

它看起来与我的其他函数类似。当我尝试 source .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 上我没有遇到这种情况

相关内容