#PROMPT_COMMANDの復習
BASHでは、PROMPT_COMMANDに関数やコマンドを設定することで、新しいプロンプトが表示される前にそれが実行される。
##PROMPT_COMMANDの使用例【.bashrcに入れる】
複数のターミナルセッションのヒストリを実行順に保存する
shopt -u histappend # セッションクローズ時のヒストリファイルへの自動追記をOFF
export PROMPT_COMMAND="history -a" # コマンド実行ごとにヒストリーをファイルに書き出す
iTermのタイトルにいろいろ表示させる
export PROMPT_COMMAND='echo -ne "\e]0;${USER}@${HOSTNAME%%.*} [${LINES}x${COLUMNS}]\a"'
luser@MacBook-Air [40x120]
###Qiitaに掲載されているPROMPT_COMMANDの応用例
#PROMPT_COMMANDの問題
これらの複数のことをPROMPT_COMMANDで行おうとすると、
export PROMPT_COMMAND="hogehoge; ${PROMPT_COMMAND}"
とPROMPT_COMMANDに追記していくようになるのですが、注意しないと、.bashrcの再読読み込み. .bashrc
としたときなど、以前のPROMPT_COMMANDが残ってしまうことがあります。
また、複雑なプロンプトの設定を支援してくれるbashishは、勝手にPROMPT_COMMANDをunsetしたり、書き換えたりします。
#解決法:ディスパッチ処理の導入
そこで、PROMPT_COMMANDにはディスパッチ処理のみを登録し、個別の処理は、PROMPT_COMMAND_hogehogeに設定します。
# ディスパッチ処理
dispatch () {
export EXIT_STATUS="$?" # 直前のコマンド実行結果のエラーコードを保存
local f
for f in ${!PROMPT_COMMAND_*}; do #${!HOGE*}は、HOGEで始まる変数の一覧を得る
eval "${!f}" # "${!f}"は、$fに格納された文字列を名前とする変数を参照する(間接参照)
done
unset f
}
export PROMPT_COMMAND="dispatch"
# iTermのタイトルにいろいろ表示させる
export PROMPT_COMMAND_STATUS='echo -ne "\e]0;${USER}@${HOSTNAME%%.*} [${LINES}x${COLUMNS}]\a"'
# 複数のターミナルセッションのヒストリを実行順に保存する
shopt -u histappend
export PROMPT_COMMAND_HISTSAVE="history -a"
#参考にしたもの
Bash変態文法最速マスター? (2.4 変数の間接参照)(2.5 特定の名前で始まる変数のリスト)
これで、PROMPT_COMMANDで複数の処理をさせるときの混乱が減れば幸いです。