Bashの設定スクリプト集をBash-it向けに移植した

だいぶ前に、いろんな環境で汎用的に使えるBashスクリプト集を作っていた。

github.com

docker コマンドや kubectl コマンドの接続先をいい感じに管理したくて、自分しか参照できない非公開の DropboxGoogle Drive に接続情報を置いて、必要に応じて半自動的に同期するようなことをしていた。大変すぎる。

SSHの公開鍵認証をエージェント経由で行うために、WSL debian なら ssh-add秘密鍵を登録する、Windows PC なら pageant秘密鍵を登録する、登録した鍵の一覧はどちらも ssh-add -l で参照できる、みたいな場合分けなどもやっていた。ssh-pageant というファイル名がいつもスペルチェッカーに怒られている。

それはそれとして、ちゃんとした技術情報の記事を書こうと思ったけど、いろんなものが動かなくなっていたので、先に環境を整えないといけなくなってしまった。

世の中の流行に乗ってみたくなったので awesome-bash を見てくることにする。

awesome-bash

awesome-bashのShell Package Management というセクションに、たぶん定番のライブラリが並んでいる。

名前が気に入ったので Bash-it を使うことにした。

Bash-it

github.com

oh-my-zsh のようにリポジトリをcloneする方式だった。 readthedocs にちゃんとしたドキュメントが整備されていて分かりやすい。

カスタマイズする方法は Custom Content — Bash-it documentation に書いてある。

BASH_IT_CUSTOM という環境変数に指定したディレクトリへ置いてある *.bash という名前のファイルを読み取ることになっている。 直下だけじゃなくて、もう一つ下の階層も探すようになっている。普通は直下を見るだけでいいと思うんだけど、なんで一つだけ下を見るようにしているんだろう。

https://github.com/Bash-it/bash-it/blob/master/bash_it.sh#L76-L86

# Custom
_log_debug "Loading general custom files..."
for _bash_it_main_file_custom in "${BASH_IT_CUSTOM}"/*.bash "${BASH_IT_CUSTOM}"/*/*.bash; do
    if [[ -s "${_bash_it_main_file_custom}" ]]; then
        _bash-it-log-prefix-by-path "${_bash_it_main_file_custom}"
        _log_debug "Loading custom file..."
        # shellcheck disable=SC1090
        source "$_bash_it_main_file_custom"
    fi
    BASH_IT_LOG_PREFIX="core: main: "
done

今の状態になる前は、/**/*.bash という書き方をしていて、空白文字を含むユーザー名など展開に失敗する場合があるからときれいに書き直された結果、深いところまで探索する機能が失われていた。 コード品質は高まったからOKだと絶賛されている。

github.com

という状態なので、深い階層を作らないよう少し気にしながら自作のスクリプト集を移植した。 それぞれのスクリプトの中で alias を定義したいときや completion を定義したいときは文字列を source してるけど、本当は aliases/custom.aliases.bashcompletion/custom.completion.bash から読み取らせたい。 試したけどちゃんと動かなかったので放り出してしまった。

github.com