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 "$@" }