export PROMPT_COMMAND='history -a'
この問題を解決する方法はありますかHISTCONTROL=ignoredups:erasedups
?
私は別のBashシェルタブを開いたときに電子を使って現在保存されていない履歴行をインポートしましたが、残念ながら重複した行が追加されているようです。 HISTControlオプションは、シェルが閉じたときにのみ適用されるようです。たとえば、history
重複した項目を一覧表示できますが、表示できませんが表示できcat .bash_history
ます。
shopt -s histappend
したがって、デフォルトでまたは他の設定に従って、終了時にメモリまたは一時記憶域の重複排除履歴のみが.bash_historyに保存されていると想定します。
追加する前に、重複排除された履歴を書き込むことができることを確認しようとしましたが、うまくいきませんexport PROMPT_COMMAND='history -w; history -a'
でした。
答え1
そうでない場合history -w
(BTWは連続的な重複のみを削除します)、これによりすべてのシェルはすべての新しいプロンプト(EnterまたはBreakを押す)で同じほぼリアルタイムの履歴を共有し、タブで別々に処理されます。理想的な。
一般的な質問は、共通の履歴を使用しながら重複排除の問題を解決する方法です。Bash 履歴: 'ignoredups' および 'erasedups' 設定がセッション全体の共通履歴と競合します。
リアルタイムの共同記録は必要ありませんが、記録を保存して新しいシェルに正しく適用したいと思います。history -a
これを行います。export PROMPT_COMMAND='history -a'
少なくとも各プロンプトの履歴を保存してください。 (BTW、-wはファイルからシェルリストを書き込み、-aはファイルにファイルを追加します。)
したがって、リアルタイム記録なしで重複エントリを削除する唯一の方法は、コマンドを使用することです。 (もともとこれをcronjobに入れる予定でしたが、今は必要ありません。下の編集の説明を参照してください。)
tac $HISTFILE | cat -n | sort -k2 -k1n | uniq -f1 | sort -nk1,1 | cut -f2- | tac > $HISTFILE
file1="/etc/cron.daily/bash_history_dedup"; echo '<command>' $file1; chmod +x $file1
cronジョブを使用して、履歴ファイル(ユーザー、ルート×毎日、毎月)をバックアップすることもできます。
file1="/etc/cron.daily/backup_bash_history"; echo -e 'cp --force ~/.bash_history ~/.bash_history_bak" \nsu user -c "cp --force ~/.bash_history ~/.bash_history_bak"' > $file1 && chmod +x $file1
file1="/etc/cron.monthly/backup_bash_history"; echo -e 'cp --force ~/.bash_history ~/.bash_history_bak_monthly \nsu user -c "cp --force ~/.bash_history ~/.bash_history_bak_monthly"' > $file1 && chmod +x $file1
そのコマンドを使用して重複を削除した後、重複エントリは表示されなくなります。したがって、以前に保存された履歴リストにこれらの項目が存在する可能性があります。削除されたコンテンツはこれには影響しません。
しかし、私はこれが引数なしでコマンドをスキップするのに役立ちます。export HISTIGNORE="!(+(*\ *))"
#引数のないコマンドを無視します。 HISTTIMEFORMATと互換性がありません。同じでなければなりませんgrep -v -E "^\S+\s.*" $HISTFILE
答え2
問題は「原子的」追加です。中間点history -a
は「old」では手動で、history -n
new bashでは手動です。 (これにより、新しいコマンド内で既存のセッションコマンドが非表示になります。名前付きファイルに追加して履歴をリンクできます。)