2017年5月22日月曜日

利用中シェルに応じてコマンドを使い分ける。bash or zsh

zshとbashを同時並べつつカスタマイズしている最中に便利なコマンドであり、その雛形です。
  • zsh/bashでプロンプトの形や色などで変えていても間違えることがある。
  • キーバインドの統一カスタマイズ作業をしている最中はとりわけ混乱する。
  • 実はかなり間違えている。年に10回以上は:笑)
ので

以下をぺったんして、(当方はシェル関数はbash/zsh 共通のrcファイルにしています。共通で動かない関数は原則使いません。メンテがめんどうだからです。意識は高くないです。~/.bash_functions.rc にzsh/bash共通利用関数を書いています)
以下の実使用中の雛形では、bashrc または zshrc と打てば、rcファイルへの変更が反映されます。shrc というコマンド名もないはずなので、そういうので統一してもいいでしょう。

余談ですが、このパターンを利用して ~.keybindings というキーバインディング設定rcを.zshrc/.bashrcから読み込ませています。
#bash単独ならもちろん不要。
#@ シェル関数定義
#

    function bashrc () {
        #bashrc/zshrc で rc をシェルに応じて再読込。カレントシェル判別。
        CURRENT_SHELL=`set | grep -aoP '^(B|Z)A?SH_VERSION'`

        case $CURRENT_SHELL in
            BASH_VERSION )
              source ~/.bashrc && echo 更新完了 source ~/.bashrc ;;
            ZSH_VERSION  )
              source ~/.zshrc  && echo 更新完了 source ~/.zshrc  ;;
            *)
                echo not zsh , not bash  ;;
        esac
    }
    alias zshrc=bashrc
#zshrc としても、bashrcとしても、同じ。

# BASH_VERSION='4.3.46(1)-release'
# ZSH_VERSION=5.1.1
# csh / tcsh / fish (^fish_)などは使いませんのでこれで充足しています。

#~/.bashrc .zshrc

 if [ -f ~/.keybindings ];         then  .  ~/.keybindings    ; fi

#~/.keybindings

CURRENT_SHELL=`set | grep -aoP '^(B|Z)A?SH_VERSION'`
case $CURRENT_SHELL in

ZSH_VERSION  ) 
#ZSHはここから定義。
    bindkey "\e[3;2~" kill-word  #bash/zsh 共通
    bindkey '^x^e' edit-command-line #FC と等価 bash 標準アサインと統一した。
      ;;

BASH_VERSION )  #BASHはここから定義。

#■ ALT-シリーズ
    bind '"\ea":beginning-of-line' #alt-a も行頭に戻る。この妥協が一番よさそう

;;
esac
#.inputrc に設定するよりこっちのほうが自分は楽。

青色の行でシェル名が変数に格納できますので、bashならほげ、zshなら、ふげというシンプルなcase分岐ができています。(カレントシェルに応じて)同じようなことをしたいけれどコマンド名が微妙に違うってケースは、シェル内蔵コマンド bind(bash)/bindkey(zsh)などでもありますよね。

zsh/bashに特化していますので、
grep で、a=アスキー限定、o=一致部分切り出し、P= Perl互換正規表現
としています。これで、ZSH_VERSION という文字列がCURRENT_SHEL格納できるわけです。
~/binなどにはこの分岐を使った他のツールもおいています。

余談。grep の -Pオプションは、なんだかんだいっても便利です。Perl互換の正規表現だけ覚えていればいいのでGNUツールのみしか使わないって人にはうってつけかも。職業的なプログラマー、SEなどであれば様々なUnix環境に対応したいと思うのでしょうが、自分は関係ないので。そういえば、このオプションでなんとかなっているので、pcregrep/pcre2grep は使いませんね。以前はエクスペリメンタルだった気がしますが、今はカジュアルに使っていいのではないかと。


zshは素晴らしすぎ便利すぎです。だから人間があほになりそう!!とbashを使うんですが、zshもいいよな、と。10年位こんなことを繰り返しています。あはは。もっとインテリジェント、エレガントな解法があれば乗り換えますので、ご教授ください。

#~/.profile mint18.1の .profile(ログインシェルで読み込まれる?!)では次のように書かれていました。さっき気がつきました。


# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi


0 件のコメント:

コメントを投稿