複数の端末ウィンドウでbash履歴を保持する

複数の端末ウィンドウでbash履歴を保持する

常に複数の端末が開いています。 2時から10時までいろいろな種類の仕事をしてみてください。それでは、再起動して別の端末セットを開くとしましょう。ある人は特定のことを覚えていて、ある人は忘れてしまいます。

私は次の歴史が欲しい:

  • 各端末のすべてを覚えておいてください
  • すべての端末からすぐにアクセスできます(たとえば、lsある端末にいる場合は、すでに実行されている別の端末に切り替えて上のキーを押すとls表示されます)。
  • コマンドの前にスペースがある場合は、コマンドを忘れないでください。

bashをもっとうまく機能させる方法はありますか?

答え1

以下を次の項目に追加します~/.bashrc

# Avoid duplicates
HISTCONTROL=ignoredups:erasedups
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

答え2

私の歴史に関するすべての内容は次のとおりです.bashrc

export HISTCONTROL=ignoredups:erasedups  # no duplicate entries
export HISTSIZE=100000                   # big big history
export HISTFILESIZE=100000               # big big history
shopt -s histappend                      # append to history, don't overwrite it

# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

bash 3.2.17を使用したMac OS X 10.5では、bash 4.1.7を使用して10.6でテストされました。

答え3

これはBashセッション履歴の共有に対する私の試みです。これにより、bashセッション間の記録共有が可能になり、記録カウンタが混同されず、記録拡張が機能します!number(一部制限あり)。

Ubuntu 10.04 LTS(Lucid Lynx)でBashバージョン4.1.5を使用します。

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
    builtin history -a         #1
    HISTFILESIZE=$HISTSIZE     #2
    builtin history -c         #3
    builtin history -r         #4
}

history() {                  #5
    _bash_history_sync
    builtin history "$@"
}

PROMPT_COMMAND=_bash_history_sync

説明する:

  1. 入力した行を追加します$HISTFILE(デフォルトは.bash_history)。これにより、$HISTFILE1行が増えます。

  2. 特殊変数を$HISTFILESIZE特定の値に設定すると、Bashは最も古い項目を削除して行の長さだけを切り捨てます$HISTFILE$HISTFILESIZE

  3. 実行中のセッションの履歴を消去します。これにより、記録カウンタの数が減ります$HISTSIZE

  4. コンテンツを読み取り、$HISTFILE現在実行中のセッション履歴に挿入します。これにより、記録カウンタが行数だけ増加します$HISTFILE。行数が$HISTFILE必ずしも必要ではありません$HISTFILESIZE

  5. このhistory()機能は、組み込みの履歴をオーバーライドして、表示する前に履歴が同期されるようにします。これはボリュームによる歴史的な拡張に必要です(後で詳しく説明します)。

さらなる説明:

  • ステップ1現在実行中のセッションのコマンドがグローバル履歴ファイルに書き込まれていることを確認します。

  • ステップ4他のセッションからのコマンドを現在のセッション履歴に読み込んでいることを確認します。

  • ステップ4では、記録カウンタが増加するため、何らかの方法でカウンタを減らす必要があります。これは手順3で行われます。

  • ステップ3では、記録カウンタが減少します$HISTSIZE。ステップ4では、記録カウンタが行数だけ増加されます$HISTFILE。ステップ2では、行数が$HISTFILE正しいことを確認します$HISTSIZE(つまり、$HISTFILESIZEと同じでなければなりません$HISTSIZE)。

歴史的拡張の限界について:

数字で拡張された履歴を使用する場合は、次のことを行う必要があります。いつも番号を探すまもなく使用前に。これは、番号検索と使用の間に bash プロンプトが表示されないことを意味します。これは通常、EnterがなくCtrl + Cがないことを意味します。

通常、複数の Bash セッションがある場合、数値履歴拡張が Bash プロンプト表示間でその値を保持するという保証はありません。これが実行されると、PROMPT_COMMAND他のすべてのBashセッションの履歴が現在のセッションの履歴に統合されるためです。別のbashセッションに新しいコマンドがある場合、現在のセッションの履歴番号は異なります。

私はこの制限が妥当だと思います。それにもかかわらず、任意の歴史的数字を覚えていないので、毎回その数字を探す必要があります。

通常、私はこのようなデジタル記録拡張プログラムを使用します。

$ history | grep something #note number
$ !number

次の Bash オプションを使用することをお勧めします。

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify

奇妙なエラー:

パイプで接続された履歴コマンドを実行すると、そのコマンドが履歴に 2 回リストされます。たとえば、

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false

すべては歴史に2回記録されます。理由はわかりません。

改善のアイデア:

  • _bash_history_sync()毎回実行されないように関数を変更します。たとえば、CTRL+Cプロンプトの後に実行しないでください。CTRL+C長いコマンドラインを実行しないことにした場合、その行をあきらめることがよくあります。時々、CTRL+CBashがスクリプトを完成するのを防ぐ必要があるかもしれません。

  • 現在のセッションのコマンドは、常に現在のセッション履歴の最新のコマンドでなければなりません。また、所与の履歴番号がそのセッションの履歴項目値を保持するという副作用もある。

答え4

これを行うには、次の2行を追加する必要があります~/.bashrc

shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"

からman bash

histappendシェルオプションが有効になっている場合(以下のSHELL BUILTIN COMMANDSの下のshoptの説明を参照)、この行は履歴ファイルに追加され、それ以外の場合は履歴ファイルが上書きされます。

関連情報