我有 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 上我没有遇到这种情况