web-dev-qa-db-ja.com

方法:無制限のBash /シェルの履歴?

Bashで無制限の履歴を定義する方法はありますか?

87
Dragos

これを.bashrc(Linux)または.bash_profile(MacOS)に追加します。

export HISTFILESIZE=
export HISTSIZE=

無制限の歴史があります。現在、27000のエントリがあります。

man bashから:

HISTFILESIZEが設定されていない場合、切り捨ては実行されません。

つまり、.bash_historyは切り捨てられません

同じことがHISTSIZEにも当てはまるようですが、ドキュメントには記載されていません。

私が試してみるもう1つのきちんとした機能は次のとおりです。

HISTTIMEFORMAT変数が設定されている場合、タイムスタンプは履歴ファイルに書き込まれ、履歴コメント文字でマークされます。これにより、次のように、シェルセッション全体でタイムスタンプを保持できます。

export HISTTIMEFORMAT="%F %T "

既にお試しになったことがあればお知らせください...

83
morgenrot

https://stackoverflow.com/a/19533853/128597 から私の回答を再投稿)

長年にわたる多くの醜いイテレーションと奇妙なEdgeケースの後、これに専用の my .bashrc の簡潔なセクションがあります。

まず、コメントアウトするか、.bashrcのこのセクションを削除する必要があります(Ubuntuのデフォルト)。そうしないと、特定の環境(screenセッションの実行など)で履歴が切り捨てられます。

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

次に、これを追加します.bashrcの末尾に:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force Prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
Prompt_COMMAND="history -a; $Prompt_COMMAND"

注:すべてのコマンドは実行直後に書き込まれるため、誤ってパスワードを貼り付けた場合、履歴の書き込みを回避するために「kill -9 %%」することはできません。手動で削除する必要があります。

また、各bashセッションは完全な履歴ファイルをメモリにロードしますが、履歴ファイルが10MBに達しても(長く、長い時間かかります) bashの起動時間への影響の多くに注意してください。

42
fotinakis

〜/ .bashrcに含める:

# append a session's history on Shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

この回答は次の基準を満たしています。

  1. 別個のマスター履歴(セッションが履歴を中断することはありません)

  2. 自動履歴書き込み(ホットキーなし)

  3. まれな書き込み(各コマンドの後に追加しない)

バックグラウンド

インタラクティブな起動時に、$HISTFILESIZEが数値に設定されている場合、bashは$HISTFILEをその数値に切り捨てます。インタラクティブクローズで、シェルオプションhistappendが設定されている場合、bashは$HISTSIZE行を$HISTFILEに追加します。それ以外の場合は、$HISTFILEを上書きします。

oSX(ターミナル)のヒント

ターミナルでタブが作成されるたびに、~/.bash_profileが読み取られます。これは、bashが~/.bashrcを読み取らないことを意味します。次の行を~/etc/bash_profileに追加します。

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

画面のヒント

Screenを使用する場合、構成ファイルは〜/ .screenrcです。画面に履歴を記録させたい場合は、bashスタートアップファイルをソースする(そして履歴を記録する)ログインシェルを使用するように設定するだけです。

# use bash, make it a login Shell
defshell -bash
9
cdosborn

異なる概念(適用されない場合があります)ですが、 Shell-sink を使用すると、unlimited履歴を保持できます。

3
ChristopheD