複数のKonsoleからのbash履歴の保存が正しく機能しない


9

複数のKonsole端末を使用しています。そして、すべての端末に入力したすべてのコマンドをコマンド履歴に保存して、次に開いたkonsoleにすべてのコマンドが表示されるようにします。各端末が他の端末のコマンド履歴を上書きしないようにするために、私は次の設定を自分の.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

プロンプトにコマンド番号を表示するために最後の行を指定しました。コマンド番号。600を超えたことはありませんが、それでも私の古いコマンドの一部は履歴から消えています。繰り返し指定されるコマンドは多数ありますが、から予想されるようにignoredups、プロンプト内のコマンドを増やすことはありません。それでも古いコマンドは消えており、履歴にあるコマンドの数は常に500をわずかに超えています。

.bash_historyファイルにはまだignoredupsにもかかわらず、重複が多く含まれています。

PS:エコーの出力$HISTSIZE$HISTFILESIZE両方=1000


更新:上記ののエントリに問題が見つかりました.bashrc。ただ、呼び出しhistory -aPROMPT_COMMAND単にの.bash_historyに最後の新しいコマンドを追加します。だから、ignoredupserasedups効果がありません。

方法はありますか?すべての端末から重複することなく.bash_historyに書き込むことができますか?各コマンドプロンプトで履歴全体をロードしてhistory -rで書き直したくないのhistory -wは、ある端末で発行したコマンドが別の並列実行中の端末にも表示されるためです。結合したコマンドを新しいターミナルでのみ表示したい。

パズル、なぜ私の歴史が500にトリミングされたのかが解決されました。このマシンにsshするたびにそれが起こっていることに気づきました。.bash_profile次のエントリでを作成すると、この問題は解決しました。

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

これで、sshを実行するたびに.bashrcが実行されます。そして、履歴ファイルのサイズは単調に増加しています。


これはあなたが求めているものですか?unix.stackexchange.com/questions/1288/...
jasonwryan

いいえ。Oliのリストの2番目の要件は避けたいです。別の端末の履歴が混同されたくありません。新しい端末を起動するまで。これは、マシンを適切にシャットダウンしたときに自然に起こることです。しかし、適切なシャットダウンができない場合があり、履歴を瞬時に保存しないと、突然の電源オフですべてが失われます。
indiajoe

bug-bashこの質問が投稿されてから1年後にメーリングリストに投稿される質問とよく似ています。lists.gnu.org
archive

回答:


1

新しいコマンドを直接追加すると同時に重複を削除することはできないと結論付けました。したがって、私の解決策は、次のコマンドをしばらく実行することです。または、それを私のcrontabに入れます。

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

上記のコマンドは、コマンドの最後の出現を保持し、順序を台無しにせずに、履歴ファイルからそれより上のすべての繰り返しを削除します。


0

それは醜いだ、と私は確信していることsedawk良いでしょうが、私は私でこれを追加することで、同じ問題を解決しようとしました.bashrc

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

これにより、開いたターミナルごとに個別の履歴ファイルが作成されますが、bash内でbashを実行すると、同じ履歴が使用されますが、上書きしないでください。私の経験から警告が出ます。これは機能し、履歴が上書きされないようにしますがgrep、探している履歴を検索して見つけるために複数のファイルを使用する必要があり、時間がかかる場合があります。

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