aliasにする?functionのままにする?
.bashrcや.zshrcにaliasやfunction()を記載することってよくあると思う。
またfunctionはそのままfunction名をコマンドとして打てば実行できるし、
- 簡単なコマンドの羅列はalias
- 少し複雑な処理が必要なのはfunction
などと決めている人もいると思う。
alias hoge='_function'と書いている人に出会った
下のようにfunctionをaliasに設定している人に出会った。
# カレントディレクトリのファイルをちら見してvimで開く alias look='_look' function _look() { find_result=`find . -maxdepth 1 -type f` target_file=`echo "$find_result" | sed 's/\.\///g' | fzf 'bat --color always {}'` if [ "$target_file" = "" ]; then return 0 fi vim $target_file }
当時は「functionは書いたらそのまま実行できるのになんでいちいちアンダーバーをつけてaliasにしているのだろうか」と疑問に思った。 最近ようやくその理由が自分なりにわかってきたので紹介する。
【理由1】自作関数ということを示すため
functions
というコマンドを打ってもらえばわかるが既に定義済みの関数がたくさんある。
(もしかしたらfunctions
を実行できるのはzshまたはoh-my-zsh入れてる人だけかもしれん)
これらの関数と区別するために、その人にとって目印が_
だったのかなと推測する。
その他にも
- 既に定義済みの関数と名前がバッティングしないようにするため
private
な意味を込めたいから
など理由があるのかもしれない。
【理由2】関数名はわかりやすく、aliasは短く打ちやすいものにするため
確かに関数は.zshrcなどに定義しただけでコマンドとして使えるが、わかりやすい関数名にするとどうしても長くなる。
上記の_look
などはまだなんとなくわかるが、例えば「ターミナルからGoogle検索をする」goo
関数を作ったとしよう。コマンドは手軽に打てるよう短めな名前がベストだ。
# terminal上からGoogle検索 function goo() { # 第一引数がない場合はpbpasteの中身を検索単語とする [ -z "$1" ] && searchWord=`pbpaste` || searchWord=$1 open https://www.google.co.jp/search\?q\=$searchWord }
関数を作ってしまえばエイリアスに登録せずに実行できるので、goo
と打てばGoogleで検索することができる。
ただ、この関数を見ただけで何をしているのか非常に分かりづらい。
.zshrc
を整理する時に困るし、その都度コメントを書くのも億劫だ。
なので以下のように関数名を変更し、その関数をエイリアスに登録する。
alias goo='_searchByGoogle' function _searchByGoogle() { # 第一引数がない場合はpbpasteの中身を検索単語とする [ -z "$1" ] && searchWord=`pbpaste` || searchWord=$1 open https://www.google.co.jp/search\?q\=$searchWord }
これでgoo
と打てば実行できるし関数名を見ただけで何をするのか把握することができる。
【理由3】aliasコマンドで一覧表示するため
【理由1】でも紹介したが、定義済みの関数を表示するfunctions
コマンドというものが存在する。
しかし関数の中身まで出力されるので、関数名の一覧を表示したい時は非常に見づらい。(別にgrep
すればいいかもしれんが)
functionsコマンド
$ functions _SUSEconfig () { # undefined builtin autoload -XUz } __phpbrew_load_user_config () { if [[ -f $PHPBREW_HOME/init ]] then . $PHPBREW_HOME/init __phpbrew_set_path fi } __phpbrew_reinit () { if [[ -z "$1" ]] then local _PHP_VERSION="" else local _PHP_VERSION=$1 fi if [[ ! -d "$PHPBREW_HOME" ]] then .....(略)
対照にalias
コマンドは見やすい。.zshrcに記述するaliasじゃない、コマンドとしてalias
を実行するやつね。
aliasコマンド
$ alias | head -='cd -' ...=../.. ....=../../.. .....=../../../.. ......=../../../../.. 1='cd -' 2='cd -2' 3='cd -3' 4='cd -4' ... tigd=_gitDiffPreviewCopy tigg=_gitLogPreviewOpen
alias
コマンドはaliasに登録されている一覧を出力する。
alias hoge='_foohoge'
のように自作関数をaliasとして登録しておけば、自分で作った関数をalias
コマンドで把握することができる。
少しオマケになるが、以下の流れで自作関数の中身を知ることができる。
# aliasに登録されているものを出力 $ alias -='cd -' ....=../../.. .....=../../../.. ......=../../../../.. goo=_searchByGoogle ... # 関数の中身を出力 $ functions _searchByGoogle _searchByGoogle () { [ -z "$1" ] && searchWord=`pbpaste` || searchWord=$1 open https://www.google.co.jp/search\?q\=$searchWord }
終わり
たぶん人それぞれaliasにするか関数にするか理由があると思うんだけど、とりあえず今の俺はこんな感じでzshrcにシコシコaliasとfunctionを書いている。
人のzshrcとかあんまり気にならなかったけど、みんなどうやって書いているか興味出てきた。