bash: history -a は HISTFILE に既にテキストがない限り書き込みません

bash: history -a は HISTFILE に既にテキストがない限り書き込みません

問題文

私は、bash の履歴を使って創造的なことをするための、次のような数多くの例に従ってきました。

# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'

... しかし、断続的に動作するようです。以前の履歴を含む履歴ファイルがすでに存在する場合は、すべて正常です。

その他の関連情報

  • bash バージョン: 3.2.51、4.1.2、および 4.2.45
    • 4.2.xではこの問題は発生していないようですが、これはデフォルトではないインストールです。
  • OS: Linux および Solaris
  • ホームディレクトリはNFSマウントされています

診断手順

私は を削除し.bashrc.bash_profileを次のように設定しました:

HISTFILE=$HOME/.bash_history.test

次に、ログイン シェル (別のマシンへの ssh など) を起動し、次のような操作を実行します。

~ cat .bash_history.test
cat: .bash_history.test: No such file or directory
~ history
    1  cat .bash_history.test
    2  history
~ history -a
~ !-3
cat .bash_history.test
cat: .bash_history.test: No such file or directory

history -a次の状況では、履歴ファイルは追加されません。

  • ファイルはまだ存在しません
  • ファイルが空であるか、改行のみが含まれています。空白でも動作します。

...しかし、シェルを終了するとする作成します。その後は、history -aの場合を除き、期待どおりに動作します。PROMPT_COMMAND="history -a; history -c; history -r"これを設定した場合、シェルを終了しても履歴ファイルが作成されませんでした (exec bash最初に を実行しない限り)。

その後、bash (4.2.x) の非標準インストールを試してみましたが、問題は発生しませんでした。

答え1

このメーリングリストのスレッドこれらの問題を説明しているようです。2番目のメッセージから引用します。

bashhist.c:maybe_append_history() の現在のコード (少なくとも 15 年間存在しています) は、現在のセッションの履歴行数が履歴リストのエントリ数と等しい場合に対応していないようです。つまり、シェルの起動時に履歴ファイルから読み込まれた行がないと判断された場合、コードは新しい行を追加しません。これは間違っているように思われ、修正するパッチを添付しました。ただし、このコードは現在の形式で長い間存在していたため、他に理由があるのではないかと疑問に思っています。

(Chet Ramey、GNU bash メーリング リスト)

さらに、変更履歴4.2 には次のテキストがあります:

+                  8/13
+                  ----
+bashhist.c
+   - in maybe_append_history, change check for history_lines_this_session
+     so that we append the lines to the file if it's equal to the value
+     returned by where_history().  This means that without this change,
+     the history won't be appended if all the lines in the history list
+     were added in the current session since the last time the history
+     file was read or written.  Fixes bug reported by Bruce Korb
+     <[email protected]>

(git.savannah.gnu.org, bash git repo)

当然ながら、この問題を解決するには、bash の新しいバージョンをインストールする必要があります。

これが将来他の誰かの役に立つことを願っています。

関連情報