インターリーブなしでセッション全体でシェル履歴を共有します。

インターリーブなしでセッション全体でシェル履歴を共有します。

同様の質問がありますここしかし、別の目標を達成したいと思います。セッション間で記録を共有したいのですが異なるセッションで実行されるコマンドを混在させる必要はありません。

たとえば、AとBという2つのシェルセッションがあるとします。 Aにいくつかのコマンドを入力します。

A$ ls ~
A$ ls /etc

Bから:

B$ git status
B$ git log

シェルを入力すると、そのhistoryシェルのすべてのコマンドが表示されます。一緒に後ろに他のシェルのコマンド - これにより、常にuparrowを使用して現在のシェルから最後のコマンドを取得できます。つまり、historyシェルAでは、次のように表示する必要があります。

git status
git log
ls ~
ls /etc

シェルBでは、次のように表示する必要があります。

ls ~
ls /etc
git status
git log

どうすればいいですか?

ベストアンサー1

組み込みのソリューションはないようですが、手動で実装することはそれほど難しくないことがわかりました。各セッションの履歴を別々に保存し、各プロンプトでそれを再生成する必要があります(言葉のように遅くはありません)。コアロジックは次のとおりです。

# on every prompt, save new history to dedicated file and recreate full history
# by reading all files, always keeping history from current session on top.
update_history () {
  history -a ${HISTFILE}.$$
  history -c
  history -r
  for f in `ls ${HISTFILE}.[0-9]* | grep -v "${HISTFILE}.$$\$"`; do
    history -r $f
  done
  history -r "${HISTFILE}.$$"
}
export PROMPT_COMMAND='update_history'

# merge session history into main history file on bash exit
merge_session_history () {
  cat ${HISTFILE}.$$ >> $HISTFILE
  rm ${HISTFILE}.$$
}
trap merge_session_history EXIT

バラよりこの点いくつかの保護措置とパフォーマンスの最適化を含む完全なソリューションです。

おすすめ記事