すべてのシェル間で単一のコマンド履歴を共有できますか?
デフォルトでは、最初に終了したシェルが履歴を上書きしているようです。各シェルに「名前」と独自の履歴ファイルがある場合は、以前にこれを行ったことがありますが、今ではシェルの使用が軽くなり、過度に感じられます。
修正する
incapendhistoryを有効にしていないようです。
> setopt | grep inc
実行するとsetopt incappendhistory
、この問題は解決されます。その後、履歴ファイルを見るとすぐにファイルが添付されていることがわかります。
ただし、この履歴は新しいシェルを開いた後にのみ他のシェルで使用できるようです(これが私が望む動作かもしれません)。他のシェルのコマンドを使用して行った設定はすぐにsharedhistory
使用できます。setopt
私は実際にそれが私が追求しているとは思わない。なぜなら、異なる殻に異なる歴史を持つことが役に立つからです。私はしたくない失う歴史。
答え1
まず、デフォルトではzshはコマンド履歴を保存しません。HISTFILE
履歴を保存するファイルのパスとSAVEHIST
保存する行数を設定する必要があります。バラよりZshのコマンド履歴。この回答の残りの部分では、記録が保存されていると仮定し、記録を保存してロードするタイミングについて説明します。
デフォルトでは、zshは開始時に履歴をロードし、終了時に履歴を保存します。履歴を保存するときは、現在のセッションの履歴を履歴ファイルに追加します。したがって、同時セッションがあっても履歴は失われません(記録ファイルが1.2x$SAVEHIST
行に達するまでzshはファイルをクリーンアップします)。このアプローチの最大の利点は、セッション内の行がまだグループ化されていることです。欠点は、セッションAの行がセッションAの終了後に開始されたセッションにのみ表示されることです。もう1つの欠点は、コンピュータ(またはzsh)がクラッシュすると記録が失われることです(ただし、SSH接続を切断するネットワークの問題によって端末が単に消えた場合は記録が保存されます)。
開くとshare_history
オプションを選択すると、zshは各履歴行を入力するとすぐに保存し、新しい履歴行が利用可能になるとすぐにロードされます。 (またはより正確には、新しいプロンプトが表示される前にコマンドラインを編集してもzshは履歴を読みません。)最大の利点は、すべてのセッションで履歴行をすぐに使用できることです。最大の欠点は、異なるセッションの行が一緒に混ざり合って、レコードの連続した行が互いに理解できないことです。
オプションがありますinc_append_history
そしてinc_append_history_time
。 zshは各コマンドが実行されるとすぐに履歴を保存しますが、自動的に新しい履歴行を読み取ることはありません(もちろん起動時を除く)。この_time
バリアントは以前の代わりにコマンドを実行した後に履歴を保存するため、zshは実行時間を節約できます。
閉じてもいいappend_history
オプションを使用すると、zshは履歴ファイルを追加するのではなく、保存時に履歴ファイルを上書きします。したがって、セッションAを開始してからセッションBを開始してからAを終了し、Bを終了すると、Aの履歴が失われます。私はこの動作を選択する必要がある理由を考えることはできません(しかしこれはbashのデフォルト動作です)。
次のコマンドを実行して、いつでも履歴ファイルに新しい行をインポートできます。fc -RI
。これはshare_history
、他のセッションで履歴を明示的にインポートする機能を使用しない場合に便利です。
次のコマンドを実行して、いつでも新しい行を履歴に保存できます。fc -AI
。これは、現在のセッションの履歴を明示的にエクスポートするために使用しない場合や時々来る場合にinc_append_history
便利share_history
です。
この回答で説明するデフォルト値は zsh デフォルト値です。一部のディストリビューションとほとんどのzsh構成フレームワークは、少なくともデフォルトで履歴を有効にし、いくつかの履歴関連オプションを変更できます。