ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

【bashrc/zshrc】alias、functionの俺的命名規則3つ

aliasにする?functionのままにする?

f:id:rasukarusan:20190304231921p:plain:w400

.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とかあんまり気にならなかったけど、みんなどうやって書いているか興味出てきた。