シェルのエイリアスで環境変数を使いたいときありますよね、多分。みなさんきっとあるでしょう。
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
わかってしまえば「あぁそうだよねそりゃそうだ初心者かよ恥ずかしい」となるんですが、無駄にハマってしまったし今後も不意にやってしまいそうだと思ったので戒めのために残しておきたいと思います。