#ふがしメモ

趣味とかプログラミングとか色々

bashrcで設定するaliasは関数を経由しよう

bashrcの中身

まずはbashrcの中身見てもらったほうがわかりやすいと思った

  • .bashrc
setalias ()
{
  alias ls='ls -l'
 }

setalias

setalias関数の中でaliasを設定して、それを呼び出すだけのコード

なぜそうすべきか

を語るにはaliasを貼るデメリットを挙げることが手っ取り早い。
シェルスクリプト内で実行されたコマンドの出力が、貼ったaliasによって期待したもので無くなること」である。
まぁ正確には「シェルスクリプトを実行した時」ではなく、「sourceとしてシェルスクリプトを読み込んだ時」が正しい。

// シェルスクリプトを実行した時
$ bash script.sh

// シェルスクリプトを読み込んだ時
$ source script.sh

sourceコマンドを用いずに実行した時、内部的には新しい端末が立ち上がって現在使用している端末とは隔離された環境でそれぞれのコマンドが実行される。 要するに実行している端末の環境を何も引き継がない。

  • test.sh
echo ${RIPPLE}

というシェルスクリプトがあったとして、

$ RIPPLE=善
$ bash test.sh

と実行した時にtest.shは隔離された新しい端末で実行されるために、善が代入されたRIPPLE変数を引き継がない。
よって出力は改行のみとなる。

対して

$ RIPPLE=善
$ source test.sh

と実行した場合には現在の端末の情報を引き継いだままそのままtest.shの中身を実行する。
つまり出力として"善"が出力されるわけである。引き継ぐのは環境変数だけではなく、aliasについても同様である。
ちなみに現在の端末の情報を引き継ぐのと同様に、スクリプトの中で定義したaliasや環境変数を現在の端末に引き継ぐ。

sourceは本来、読み込んだスクリプトの中にいろいろな環境変数を定義することで、現在開いている端末上にビルド環境や実行環境を整えるために用いられる。
そして環境を整える段階でcdコマンドやlsコマンドを使用することが多々ある。

本来であればlsコマンドはカレントディレクトリのファイル、ディレクトリを表示するだけのコマンドである。
そしてシェルスクリプトはその出力が帰ってくることを期待しているわけである。
しかし冒頭に挙げたようなaliasを貼った場合、lsと打ち込んで返ってくるのはls -lの出力である。

いろいろとbashの仕様について記載したが、デメリットとはこういうこと。
もちろんaliasを解除するコマンドはあって

// lsのaliasだけ剥がしたい場合
$ unalias ls

// すべてのaliasを剥がしたい場合
$ unalias -a

aliasを全て無効にすることによって、確実に読み込むスクリプトが期待する環境に戻すことができる。
しかし便利に使うために貼っていたaliasが全部剥がれ、このあとに作業に支障をきたすことは間違いない。

しかしここでaliasの設定を関数化しておくとどうなるか。

$ unalias -a

// すべてのaliasが剥がれていることの確認
$ alias

$ source test.sh

// 作った関数を呼ぶ
$ setalias

// 便利だった環境がすぐに戻る
$ alias
alias ls="ls -l"

と、unaliasコマンドと作成した関数名だけでクリーンな環境と普段使いの便利な環境を切り替えることが容易になる。
といった理由で、bashrcの中にただaliasを設定するだけでなく、ひと手間かけておくことで後々に便利になりますよという記事でした。

わからないこと、疑問に思ったことがあればコメント、Twitterまでお気軽に