異なるタブ間で共有bashed履歴を取得する方法


19

/unix//a/1292/41729の回答を使用して、個別のbash端末間でリアルタイムの共有履歴を有効にしました。上記の回答で説明したように、これは以下を追加することで達成されます。

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

bashのシェルは、例えば開放異なるbashの端末が使用して(分離されている場合、これは罰金を動作しますCTRL+ALT+T。私が使用している場合しかし、それは動作しませんtabs、むしろ新しいウィンドウよりも開放端子`Ctrl + Shiftキー+ T)から(。なぜ、この動作の違い?どのようにさまざまなタブ間でもbash履歴を共有できますか?

更新:異常な動作に気付きました。CTRL+C入力すると、他の端末(タブかどうかに関係なく)で最後に入力したコマンドが正しく表示されます。CTRL + Cで履歴を強制的にフラッシュして、正しく共有されるようにするのと同じです。

例として、出力(T1は端末1、T2は端末2を示します):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed

これがヒントを提供できることを願っています!


~.bashrcファイルに追加しましたか?ちなみに、これらの変数のエクスポートは無意味です。環境スペースを無駄にするだけです。
ガイラ

@geirhaはい、.bashrcファイルに追加しました。エクスポートに関するコメントをありがとう。
ルカセロン

回答:


2

同期が行われる前に、他の端末の履歴アクセスしようとしているようです。PROMPT_COMMAND新しいプロンプトが表示される直前、つまりコマンドを実行した、次のコマンドを入力する前に実行さます。したがって、T1ではすぐには発生しません。新しいプロンプトを表示する必要があります。

これをテストするには、ステップでこのバリアントを試してください(<enter>T1 に追加を追加しました):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

この追加のEnterキーを押すと、新しいプロンプトが表示され、PROMPT_COMMAND履歴が実行されて同期されるため、この上矢印は、必要に応じてのcd代わりにを取得することを期待lsしています。残念ながら、必要に応じてコマンドを実行せずに、すべての端末で同期を即座に実行する方法はないと思います。事実上、これはすべてのログインセッションで常に履歴リストを継続的に同期する必要があり、これはCPUとディスクのスループットの大きな浪費になります。


正しいです。Enterキーを押すと同期されます。?メモリやCPUの無駄があってもどのように私は(それが多すぎると、私はいつもそれを無効にすることができますが、私はそれを試してみることにしたいと思います)の同期を強制することができ
lucacerone

1

私は同じ質問をしました、そして、ここに私が思いついた答えがあります....

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

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

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

PROMPT_COMMAND=_bash_history_sync


私が試す前に2つの明確化:他のヒステリーを削除する必要があります-オプション?これは.bashrcにありますか?
ルカセロン

残念ながら機能しません
...-ルカセロン

HISTFILESIZE変更されるたびに、既存の履歴ファイルの切り捨てが自動的に試行されます。変更HISTSIZEは、現在の履歴に同様の効果をもたらします。参考として、variables.c直前のbash srcのコメントを参照してくださいsv_histsize
ブライアンヴァンデンバーグ

1

その行を.bashrcファイルに追加します

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" \$1)}'; $PROMPT_COMMAND"

注意:

最初に私はテストベイをkillallでbashにUSR1信号を送信しましたが、後で一意のシェル名、testshellというbashコピーを使用して、実行可能なシェル(たとえばcronプロセス)を殺さないようにすることを考えましたワーキング。

killallは十分に選択的ではなかったので、ttyにタイトなbashプロセスのみを強制終了するスクリプトに置き換えました(ps attyに関連付けられたプロセスのみを報告します)

新しいPROMPT_COMMANDを使用するためにセッションを再起動することを忘れないでください。テスト中に、以前のテストの多くがPROMPT_COMMAND内にスタックされていました。


新しいユーザーと他のシェルは必要ありません。killall追加の-u引数, e.g. -u $(whoami) `を使用して、同じユーザーのプロセスにのみシグナルを送信するように指示できます。
フィリップウェンドラー

cshの構文が間違っていると思います... @PhilippWendler少し詳しく説明していただけますか?
ルカセロン

質問はbashに関するものなので、bash構文を使用しました。私はcshを知りません。bashのために、killall -q -USR1 -u $(whoami) bash現在のユーザーのすべてのbashプロセスにUSR1信号を送ります。
フィリップウェンドラー

@Philipp ty btw専用のシェルソリューションはテストしませんでした。cronbashスクリプトが実行されるケースを修正するためでした。
エマニュエル

書き直した@LucaCeroneは動作しているようです
エマニュエル

0

別のログインの数を表示する精巧なbashプロンプトを作成しようとしたときに、私はYakuakeで同じ奇妙な動作をしました。タブの数は増えませんでした。私の回避策はbash、すべての新しいタブでYakeakeを再度実行し、基本的にbashでbashを開始するように指示することでした。それは完璧に動作し始めました。あなたにも役立つかもしれません。私の盲目的な推測は、コンソール用のGUIがbash構成自体をロードし、それをbashインスタンスにフィードすることです。彼らといじることができるかもしれません。


bashにbashをロードしようとしましたが、何の成功もなしに:(
lucacerone
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.