21
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[BASH] PROMPT_COMMANDで複数の処理を行う

Last updated at Posted at 2015-09-30

#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に設定します。

.bashrc
# ディスパッチ処理
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で複数の処理をさせるときの混乱が減れば幸いです。

21
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?