方法:無制限のBash / shell履歴?


回答:


82

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

export HISTFILESIZE=
export HISTSIZE=

そこに行く、無制限の歴史。現在、27000のエントリがあります:)

からman bash

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

つまり、.bash_history切り捨てられることはありません

同じことがHISTSIZEにも当てはまるようですが、文書化されたものは見つかりませんでした。

私が試したいもう一つのきちんとした機能はこれです:

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

export HISTTIMEFORMAT="%F %T "

既に試したことがある場合はお知らせください...


3
これは多くの場合実際には機能せず、bash履歴は依然として切り捨てられます。より完全なソリューションについては、以下の回答を参照してください。
fotinakis

2
警告:これにより、gdb; HISTSIZE変数を設定すると、0として取得されるため、履歴サイズが完全に無効になります。
マッテオイタリア14

2
注:必要はありません。行数(バイトではありません)でありexport変数を設定すると(およびシェルが終了すると)HISTFILESIZE履歴ファイルの切り捨てが発生します HISTFILESIZE。したがって、設定ファイルで異なる値を2回設定しないでください
...-vaab

@vaab:HISTFILEをエクスポートしないと、サブシェルでhistfileが「echo $ HISTFILE」を使用しているものが表示されないため、必要ではありませんが、役立つ可能性があり、検出できる害はありません。
ジェフリアマン

41

https://stackoverflow.com/a/19533853/128597から私の答えを再投稿します

長年にわたる多くの大規模でiterationいイテレーションと奇妙なエッジケースの後、これに専用の.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の起動時間に大きな影響はありません。


4
を設定するとHISTFILESIZE、履歴ファイルが切り捨てられます。このため、必要なイベント以外のイベントの発生を削除する必要があります。また、シェルの終了時に切り捨てられます(ただし、これは予期されています)。そして、あなたは必要はありませんexport
vaab

3
@vaabエクスポートしない場合、次のような操作をbash --norc行うと、履歴が再度切り捨てられます。
永威呉

1
export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"セッションごとに(ホスト名とtty名に基づいて)シェル履歴を保持するために使用します。もちろん、最初に〜/ histディレクトリを作成する必要があります。
ジェフリアマン

2
PROMPT_COMMANDの値を確認し、盲目的にこれを繰り返し追加しないでください。システムに異常な影響を与えます。nullチェック以上のシェル変数展開検索の方がおそらく安全です。
dragon788

3
:私は呼ばdragon788 @問題を回避するためにこれを使用PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
ブライアン・バンデンバーグ

9

〜/ .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に読み込まれます~/.bashrc。つまり、bashはを読み続けません。に次の行を追加します~/etc/bash_profile

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

スクリーンのヒント

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

# use bash, make it a login shell
defshell -bash

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