aliasとシェル関数の使い分け

aliasとシェル関数の違いについてのメモ。

たとえばgrepコマンドを常にロケール非依存にて扱い処理を高速化するにあたり、一見、次の二つの定義は同等に見える。

alias grep='LC_ALL=C grep --color=auto'
grep() {
    LC_ALL=C command grep --color=auto "$@"
}

しかし、これらは実際は異なる。 具体的には、aliasはインタラクティブモードの場合のみ機能し、シェル関数は非インタラクティブモードにおいても参照される。 また、同名のシェル関数とエイリアスが存在する場合、まずエイリアスが展開された後、シェル関数が実行される。

したがって、常にコマンドそのものを置き換えたい場合はシェル関数、端末から実行した場合のみ置き換えたい場合はaliasを使うことが好ましい。 たとえば、grepにおいてロケールは常に無視したい、色付けは端末に出力する場合のみ考慮したいなら、次のようにする。

alias grep='grep --color=auto'

grep() {
    LC_ALL=C command grep "$@"
}

ここで、シェル関数において関数内のコマンドは一つのみであるので、exit statusを明示的に返す必要はない。

もっとも、grep --color=autoは標準出力が端末かどうかを確認するので、実用上はすべてシェル関数にまとめてしまっても問題はない。

grep() {
    LC_ALL=C command grep --color=auto "$@"
}