それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashの複数タブ間コマンド履歴(ヒストリ)共有とPROMTO_COMMAND変数について

bash でもコマンド履歴の即時反映をしたい

複数タブでターミナルを使ったり、複数ウインドウでターミナルを使うと、bashの履歴が共有されて無くて、悲しいことがある。

zsh の機能で紹介されることも多いですが。それ bash でも出来るよ。

共有方法
export PROMPT_COMMAND="history -a"

以上!

これで、複数ターミナル。タブ、( 設定次第では screen tmux ) でヒストリを共有することが出来る。

Mac OSXの場合は iTerm.appTerminal.app でも共有できるんだな

GNU Screen で使える設定

さらに強力に即時反映をするならば、screen の場合は即時反映をするために

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

が必要になる。。。。Enterを打てばすぐに反映される。わたしゃここまでやらないけど

PROMPT_COMMAND とは?

PROMPT_COMMAND は コマンドが実行されて、次のPS1が表示されるまでに実行されるもの。

関数を書けば、関数を実行してくれる。

man によると
       PROMPT_COMMAND
              設定されていると、プライマリプロンプトを出す前に毎回、 この値がコマンドとして実行されます。

PROMPT_COMMANDを遊んでみる

function my_prompt_command (){
     status=$?
     echo command last exit status is $status
}
export PROMPT_COMMAND="my_prompt_command"

ヒストリ共有って便利ですか?

じつは、個人的には、ヒストリ共有は余り使わない。GNUScreenではオフにしてる。複数ウインドウ限りオンにしてます。

私の場合、複数タブやscreen などを起動するときは、「用途ごと」にタブを開くので、コマンド履歴がすべて同じなってしまうとむしろ邪魔で仕方がない。

私の PROMPT_COMMAND='history -a'
history -a

これだけで、十分なことが多い。

history -a ここまでのヒストリを .bash_history をファイルに追記してくれる。

PROMPT_COMMANDで履歴管理の他の使い方

たとえば、間違って入力したコマンドはヒストリに保存したくないなど。

typo した汚いコマンド履歴が残るのが恥ずかしくて嫌な時もあります。そういうときは次のようにすれば回避できます。

function my_prompt_command (){
     status=$?
     echo last_status $?
     if ((  status  == 127 ));  then
          history -r
     else
          history -a
     fi
}
export PROMPT_COMMAND="my_prompt_command"

まぁ、これも、一見すると便利そうだが、間違って入力したコマンドは再編集するほうが圧倒的に多く、保存しないのは不便なので余り役に立たないと思いますが。 こういうことが出来ますよーって程度に見ておいてください。

参考資料

  • help history
history: history [-c] [-d offset] [n] または history -anrw [filename] または history -ps arg [arg...]
    ヒストリ一覧を表示または操作します。

    行番号をつけてヒストリを表示します。操作した各項目には前に`*'が付きます。
    引数 N がある場合は最後の N 個の項目のみを表示します。

    オプション:
      -c    ヒストリ一覧から全ての項目を削除します。
      -d offset    OFFSET 番目のヒストリ項目を削除します。

      -a    このセッションからヒストリファイルに行を追加します
      -n    ヒストリファイルからまだ読み込まれていない行を全て読み込みます
      -r    ヒストリファイルを読み込み、内容をヒストリ一覧に追加します
      -w    現在のヒストリをヒストリファイルに書き込みます。そしてそれらを
        ヒストリ一覧に追加します

      -p    各 ARG に対してヒストリ展開を実行し、結果をヒストリ一覧に追加し
        しないで表示します
      -s    ARG を単一の項目としてヒストリ一覧に追加します

    FILENAME を与えた場合、FILENAME がヒストリファイルをして使用されます。それが
    無く、$HISTFILE に値がある場合その値が使用されます。そうでなければ
    ~/.bash_history が使用されます。

    もし $HISTTIMEFORMAT 変数が設定され、NULL で無ければ、strftime(3) の書式
    文字列として各ヒストリ項目の時刻を表示する際に使用されます。それ以外は
    時刻は表示されません。

    終了ステータス:
    無効なオプションが与えられるかエラーが発生しない限り成功を返します。