.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をsourceしようとすると、

$ 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

これは通常、関数名がすでにエイリアスパラメータ付き。

エイリアスの置換はシェルの解析のかなり早い段階で行われるため、関数の宣言にも影響します (他のものも同様)。たとえば、次のような場合...

alias dualpush="push; push --again"

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

...それは次のように拡張されます:

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

元のエイリアスがコマンドで終わる場合それなしパラメータが間違っていても、関数は正しく動作しますが、関数名は間違っています(他の潜在的な驚き!)ただし、そのエイリアスの最後のコマンドがもっているいくつかの引数がある場合、展開は関数宣言として認識されなくなり、代わりに()コマンドライン引数の途中に が表示され、パーサーによって拒否されます。

答え2

ターミナルを閉じた後、まったく同じコマンドが機能します。Mac では bash 関数を使用する際に欠陥があり、dualpushコメントアウトされた bashrc を source した後、ターミナルに残ります。ターミナル全体を再起動すると、同じコマンドが機能します。この不適切な動作は理解できませんが、これは Ubuntu では発生しません。

関連情報