Let's write β

プログラミング中にできたことか、思ったこととか

rbenvをPlan9portのrcに対応させるPRを送った

plan9の標準シェルrcを最近メインで使い始めたのですが、ヒストリー機能がないとかそういうのは自前でやるとしても rbenvなどの普段使っているツールが動かないのは辛いです。

rbenvなどは、rbenvからshell scriptを出力しそれをシェル側でevalする形で環境変数を設定したりPATHを設定したりしています。 例えばbashでrbenvを使うときに

eval $(rbenv init -)

のようにすると思いますが、これは

export PATH="/Users/pocket7878/.rbenv/shims:${PATH}"
export RBENV_SHELL=bash
source '/Users/pocket7878/.rbenv/libexec/../completions/rbenv.bash'
command rbenv rehash 2>/dev/null
rbenv() {
  local command
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "$(rbenv "sh-$command" "$@")";;
  *)
    command rbenv "$command" "$@";;
  esac
}

というスクリプトがrbenvから出力されこれがevalされてrbenv関数をシェル内に定義する形で行われています. 幾つかのサブコマンドも同様の方法でシェルが操作されているのですが、rcシェルはshシェルとは文法が異なるので そのままでは動きません。

同様の問題を抱えていそうなfishシェルについては既にpatchが取り込まれていたので、ソースコードをざっくりとfishで検索して 対応する箇所を大まかに絞って幾つかのサブコマンドにrcへの分岐を組み込みました。

github.com

特にrcではシングルクオートとダブルクオートの扱いが変わっていたりするのでそのあたりの考慮が大変でした。