Edited at

シェルのエイリアスで環境変数を使うときはクォーテーションに気をつけよう

More than 1 year has passed since last update.

シェルのエイリアスで環境変数を使いたいときありますよね、多分。みなさんきっとあるでしょう。

dockerをrunしてカレントディレクトリをマウントしてごにょごにょしたいときとか。長ったらしいコマンド打ちたくないんですみたいな。

僕も例に漏れず、実際にエイリアスをいくつか貼っていたんですが、エイリアスのクォーテーションによって意図した挙動になっていないことがありました。


例えば

例えばなんですが、zshで貼ってたこんなエイリアス。

alias here='echo $PWD'

打ったらまぁ普通にカレントディレクトリが出ます。

$ here

/Users/ryosukes

これをダブルクォーテーションで括って名前を変えることにしました

alias there="echo $PWD"

打ったらまぁ普通にカレントディレクトリが出ます。

$ there

/Users/ryosukes

しかしディレクトリを掘って移動して実行すると

$ mkdir ~/develop

$ cd ~/develop
$ there
/Users/ryosukes

おやおや。カレントディレクトリを出してくれません。

じゃあhereではどうでしょう

$ cd ~/develop

$ here
/Users/ryosukes/develop

ちゃんと出してくれますね。


何が起きてるか

あまり深くは挙動の調査を行なっていないのですが、シングルクォーテーションだと実行時に変数展開され、ダブルクォーテーションだとシェルのログイン時に変数展開されるぽいです。

which コマンドでエイリアスを確認するとわかりやすいです。

$ which here

here: aliased to echo $PWD
$ which there
there: aliased to echo /Users/ryosukes


わかってしまえば「あぁそうだよねそりゃそうだ初心者かよ恥ずかしい」となるんですが、無駄にハマってしまったし今後も不意にやってしまいそうだと思ったので戒めのために残しておきたいと思います。