logo
Published on

Bashのエイリアスと関数の同一名称での同時定義には気をつけたほうがいいって話

Authors

Linuxパソコン・サーバーのBashプログラミング言語(スクリプティング言語)上のコマンドラインにおいて、エイリアスと関数の同一名称での同時定義には気をつけたほうがいい、というお話についてです。

身に覚えがないsyntax error near unexpected tokenはだいたいこれが原因だったりします。 普段使っている.bashrcを、リモートの他の環境の.bashrcに追記ペーストしてリロードすると、同エラーが出ることがあります。 んん、ローカルの環境じゃエラーにならないし、spellcheckで文法チェックもしてるけど問題ない。なんでだろう。 そんなときはbashのバージョンを確認するより前にこちらの原因を疑ったほうがよいです。

以下の名前が同じエイリアスと関数を同時に定義していたとします。

something(){
  echo something
}

alias something="echo something"

この同時定義を、二通りの順番で定義してみるとします。それの結果が以下。


yuis@yuis:~$ bash
yuis@yuis:~$
yuis@yuis:~$ something(){
>   echo something
> }
yuis@yuis:~$
yuis@yuis:~$ alias something="echo something"
yuis@yuis:~$

yuis@yuis:~$ bash
yuis@yuis:~$ alias something="echo something"
yuis@yuis:~$ something(){
bash: syntax error near unexpected token `('
yuis@yuis:~$   echo something
something
yuis@yuis:~$ }
bash: syntax error near unexpected token `}'
yuis@yuis:~$
yuis@yuis:~$
https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_2afc0595-ecac-4073-8868-a996da54a5d5.png

前者は関数をまず定義し、次にエイリアスの定義をしていますね。エラーは出ていませんし、でなくて普通かと思います。 後者はその順番が逆になっていますが、エラーが出てしまいました。

関数はエイリアスよりも弱い存在なので、関数として定義されていたものをエイリアスとして上書きすることはできても、エイリアスとして定義されているものを関数で上書きすることはできないということです。

一方のそれはエラーもでませんので、この問題はわかりづらいですね。

これと同じことを.bashrc上でやると、同じくエラーがでます。または、bashrc上でエイリアスを定義しておき、コンソール上で同名の関数を定義しようとすればエラーになります。 bashrcを更新してそういったものを排除しても、bashを更新しないと以前の定義されたエイリアスが残っているため、bashrcまたはコンソール上での関数の読み込みでエラーになります。