bash でもコマンド履歴の即時反映をしたい
複数タブでターミナルを使ったり、複数ウインドウでターミナルを使うと、bashの履歴が共有されて無くて、悲しいことがある。
zsh の機能で紹介されることも多いですが。それ bash でも出来るよ。
共有方法
export PROMPT_COMMAND="history -a"
以上!
これで、複数ターミナル。タブ、( 設定次第では screen tmux ) でヒストリを共有することが出来る。
Mac OSXの場合は iTerm.app
と Terminal.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) の書式 文字列として各ヒストリ項目の時刻を表示する際に使用されます。それ以外は 時刻は表示されません。 終了ステータス: 無効なオプションが与えられるかエラーが発生しない限り成功を返します。