エイリアスにする? それとも関数にする?

  • 6
    いいね
  • 4
    コメント

Bourne 系対話シェルの初期化ファイル (.bashrc とか .zshrc とか) でコマンドの動作を変更しようとするとき、エイリアスにするか関数にするか迷ひませんか。私はさっき迷ひました1。少し考へて、かういふ風に使ひ分ければいいのかなといふのをここにメモっておきます。

複雑なことをするなら関数一択

かういふのはエイリアスには無理。

mkdircd() {
  mkdir -p "$@" && cd "$1"
}

コマンドの挙動を破壊的に変更するならエイリアス

例へば alias grep='grep --color=tty' は grep コマンドの出力を条件付きで少し変へるだけ。grep コマンドの出力を他のコマンドにパイプしたりするときは grep コマンドは普通の grep と同様に動く。よって、他の関数とかエイリアスとかで grep が使はれてゐたとしてもそれらがバグることはほぼない。こんな場合は、 grep() { command grep --color=tty "$@"; } といふ風に関数として定義しても OK。関数として定義しておくと、他の関数の中で grep を使っている場合にも --color=tty の恩恵を常に受けることができる。 (grep がエイリアスだったら、エイリアスを定義した後に定義した関数の中でしか --color=tty は効かない)

一方で例へば alias rm='rm -i' は rm コマンドの動作を大きく変更するので、関数にはしない方が良い。他の関数で rm コマンドを使ってゐる場合に、その関数の中でも「ファイルを消すたびに本当に消すか聞く」といふ動作になってしまふ。その関数で rm の標準入力が何かにリダイレクトされてゐたらおそらく意図しない動作を引き起こす。

また、エイリアスを定義した後に関数を定義するとその関数の中でもエイリアスが効くことに注意。定義の内容によってはエイリアスと関数の定義順序が重要だ。

別解

Csh 系や fish なら関数しかないので迷ひません。

シェルスクリプトの場合

シェルスクリプトではエイリアスは普通は使ひません。また、 grep() { command grep --color=tty "$@"; } みたいに既存のコマンドの動作を変更する同名の関数を定義することも普通はありません (紛らはしくない様に、被らない関数名にします)。


  1. 何年エンジニアやってるんだよ 今更かよ