複数のターミナルウィンドウでbash履歴を保持する


526

常に複数の端末を開いています。2から10まで、どこでもさまざまなことをやっています。ここで、再起動して別の端末セットを開きます。あるものを覚えている人もいれば、忘れている人もいます。

次のような履歴が必要です。

  • すべての端末のすべてを記憶します
  • すべての端末からすぐにアクセスできます(たとえば、ある端末にいる場合はls、すでに実行中の別の端末に切り替えてから上に押してls表示します)
  • コマンドの前にスペースがある場合、コマンドを忘れないでください。

bashをそのように動作させるためにできることはありますか?


57
私はその利点を見ることができますが、個人的には私のシェルでそれを嫌います。私は通常、非常に特定の用途のために端末で3つまたは4つのタブを開いたままにします。1つは「make」を実行し、1つはviを実行し、1つは何かを実行します。したがって、コンパイルするとき、タブ1に進み、「make」 'などが表示されます。これは私にとって非常に生産的です。したがって、突然「make」タブに移動して、ランダムなgrepコマンドが表示されたら、本当に腹が立つでしょう!ただ個人的なメモ
axel_c

4
@axel_cそれは十分に真実です。既存の端末は自分の履歴のみを表示し、新しい端末は時系列的に正確なコマンドのリストを表示するインテリジェントな方法を考えることはできません。
オリ

8
@Oliは、「既存の端末は自分の履歴のみを表示し、新しい端末は時系列的に正確なコマンドのリストを表示するインテリジェントな方法は考えられません」と書いています。どの程度(未試行): export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"。既存のシェルは、新しいコマンドを表示するために各コマンドを履歴ファイルに追加しますが、独自の履歴のみを表示します。
クリスページ

2
履歴をすべて個別に保存するか、すべてを単一の履歴ファイルにマージしますか?
kbyrd

3
簡単な答えは、bash開発者が意図したものではありません。フラッシュしてから履歴を読み直すことに基づくソリューションはおそらく動作しますが、Shlemiel The Painterには注意してください。簡単に言うと、各コマンド間の処理作業の量は履歴サイズに比例します。
ステファンゴーリチョン14

回答:


329

以下を〜/ .bashrcに追加します

# Avoid duplicates
export HISTCONTROL=ignoredups:erasedups  
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

20
このPROMPT_COMMANDソリューションの問題は、各コマンドの後に各履歴項目の番号が変わることです:(例えば、historyと1)ls 2)rmを入力した場合、!1を繰り返して1を繰り返すと、履歴番号が変更され、 rmコマンドを実行するかもしれません...
クリスキンプトン

2
これを行うと、その端末でコマンドを発行するまで「Up」を押すと、他の既に開いている端末に最後に入力したコマンドがありません-これは予想されますか?その場合、他の端末の履歴を即座に真に変更する方法はありますか?
スアン

7
@Suan、これはコマンドに基づいて私には正しいようです。nullコマンド(単にEnterキーを押す)を発行して、更新する履歴を取得できることがわかりました。
セージ

3
実際にhistory -a(...)Bash history:「ignoredups」および「erasedups」設定の質問に対するこの回答によるとセッション全体で共通の履歴と競合する重複を消去しません。この回答は、設定history -<option>で機能する一連のコマンドも提供しHISTCONTROL=ignoredups:erasedupsます。
ピョートルドブロゴスト

23
理由はないと変数は:あなたは、それらを定義しているので、彼らは(も無駄であっても非対話型のもので、)すべてのシェルで定義されます。exportHISTCONTROLPROMPT_COMMAND.bashrc
ドルメン

248

だから、これはすべて私の歴史関連の.bashrcものです:

export HISTCONTROL=ignoredups:erasedups  # no duplicate entries
export HISTSIZE=100000                   # big big history
export HISTFILESIZE=100000               # big big history
shopt -s histappend                      # append to history, don't overwrite it

# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Mac OS X 10.5ではbash 3.2.17、10.6ではbash 4.1.7でテスト済み。


3
うーん。これは、コマンド番号がプロンプトごとに変わるため、$!34を使用する機能を無効にします。@Davide @Schof @kchの回避策はありますか?

5
これを使用して、無限の履歴を取得します: bash eternal history。ただし、これは自動的にリロードされないため、上記のコードを補完します。

7
参考までにここで述べた解決策はどれも、次の問題を解決できません。2つのシェルウィンドウAとBがあります。シェルウィンドウAでを実行しsleep 9999、シェルウィンドウBで(スリープが終了するのを待たずに)sleep 9999bash履歴を表示できるようにします。
pts

1
@pts私もライブの振る舞いを目指していましたが、端末ごとに異なる作業を簡単に行える端末固有の履歴がある方が便利だとわかりました。私は、これは非常に有用であることが判明:stackoverflow.com/questions/338285/#answer-7449399それに基づいて、私は自分自身という別名作らhref瞬時に私の現在の端末の歴史を更新し、その過程で履歴ファイルをクリーンアップします。新しいターミナルを開くたびに、bashrcファイルでそのクリーンアップ/同期が実行されるため、新しいターミナルには最新の履歴があります。私はそれを一緒に使用していますhistory -a
-trusktr

6
export変数に理由はありません。変数を定義している.bashrcので、すべてのシェルで定義されます(非対話型シェルでも無駄です)
ドルメン

118

Bashセッション履歴共有での私の試みは次のとおりです。これにより、bashセッション間の履歴共有が可能になり、履歴カウンターが混同せず、履歴拡張!numberが機能するようになります(いくつかの制約があります)。

Ubuntu 10.04 LTS(Lucid Lynx)でのBashバージョン4.1.5の使用。

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
    builtin history -a         #1
    HISTFILESIZE=$HISTSIZE     #2
    builtin history -c         #3
    builtin history -r         #4
}

history() {                  #5
    _bash_history_sync
    builtin history "$@"
}

PROMPT_COMMAND=_bash_history_sync

説明:

  1. 入力したばかりの行を追加し$HISTFILEます(デフォルトは.bash_history)。これ$HISTFILEにより、1行ずつ成長します。

  2. 特別な変数$HISTFILESIZEを何らかの値に設定すると、Bash は最も古いエントリを削除することにより、行$HISTFILEより$HISTFILESIZE短くなります。

  3. 実行中のセッションの履歴を消去します。これにより、履歴カウンタがの量だけ減少し$HISTSIZEます。

  4. の内容を読み取り、$HISTFILE現在実行中のセッション履歴に挿入します。これにより、の行数だけ履歴カウンタが増加し$HISTFILEます。の行数がである$HISTFILEとは限らないことに注意してください$HISTFILESIZE

  5. このhistory()関数は組み込みの履歴をオーバーライドして、履歴が表示される前に同期されるようにします。これは、番号による履歴拡張に必要です(これについては後で説明します)。

詳細説明:

  • 手順1では、現在実行中のセッションのコマンドがグローバル履歴ファイルに書き込まれるようにします。

  • 手順4では、他のセッションからのコマンドが現在のセッション履歴に読み込まれるようにします。

  • 手順4は履歴カウンターを上げるため、何らかの方法でカウンターを減らす必要があります。これはステップ3で行われます。

  • ステップ3で、履歴カウンタがによって減少し$HISTSIZEます。ステップ4では、履歴カウンタがの行数だけ増加し$HISTFILEます。ステップ2では、の行カウント$HISTFILEが正確であることを確認します$HISTSIZE(これは$HISTFILESIZE、と同じでなければならないことを意味します$HISTSIZE)。

履歴展開の制約について:

番号による履歴拡張を使用する場合、使用する直前常に番号を検索する必要があります。つまり、番号を検索してから使用するまでの間にbashプロンプトが表示されません。これは通常、エンターもctrl + cもありません。

一般に、一度に複数のBashセッションを作成すると、番号による履歴展開が2つのBashプロンプト表示の間でその値を保持するという保証はありません。ときなのでPROMPT_COMMAND、他のすべてのバッシュのセッションからの歴史を実行している現在のセッションの歴史の中で統合されています。他のbashセッションに新しいコマンドがある場合、現在のセッションの履歴番号は異なります。

この制約は妥当だと思います。とにかく、任意の履歴番号を思い出せないため、毎回番号を調べる必要があります。

通常、私はこのような番号で履歴展開を使用します

$ history | grep something #note number
$ !number

次のBashオプションを使用することをお勧めします。

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify

奇妙なバグ:

パイプを使用して履歴コマンドを実行すると、そのコマンドが履歴に2回リストされます。例えば:

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false

すべてが履歴に2回リストされます。理由はわかりません。

改善のためのアイデア:

  • _bash_history_sync()毎回実行されないように関数を変更します。たとえばCTRL+C、プロンプトが表示された後に実行されるべきではありません。CTRL+Cその行を実行したくないと判断したとき、私はしばしば長いコマンド行を破棄するために使用します。時々CTRL+C、Bash完了スクリプトを停止するために使用する必要があります。

  • 現在のセッションからのコマンドは、常に現在のセッションの履歴の中で最新のものでなければなりません。これには、特定の履歴番号がこのセッションの履歴エントリの値を保持するという副作用もあります。


1
なぜ「history -c; history -r」の代わりに「history -n」(まだロードされていない行をリロード)しないのですか?
グラハム

@Graham:history -n履歴カウンターが台無しになるので、使いたくありませんでした。また、私はhistory -nあまりにも信頼できないことがわかった。
レスマナ

1
1つの欠点:複数行の文字列を含むコマンドは、通常、現在のセッションで保持されます。このトリックにより、それらは即座に個々の行に分割されます。-nを-c -rに使用しても役に立たず、cmdhistやlithistも役に立たない。この時点で回避策はないと思います。
ジョーリス

24
これを少し試してみたところ、実際にはhistory -a、となし-cでのみ実行する-r方が使いやすさの点で優れていることがわかりました(ただし、質問で尋ねたとおりではありません)。実行中のコマンドは、現在のシェルを終了する前でも新しいシェルですぐに使用できますが、同時に実行しているシェルでは使用できません。このように、Arrow-Upは常に現在のセッションの最後に実行されたコマンド常に選択しますが、混乱することはほとんどありません。
ジョーリス

;抜群に良い答えは、これはより一般的な「履歴-n履歴-a」とは異なり、確実に動作します
RichVel

42

を使用する方法を知りませんbash。しかし、これはの最も人気のある機能の1つですzsh
個人的に私は好むzshbashので、私はそれをお試しください。

.zshrc履歴を扱う私の部分は次のとおりです。

SAVEHIST=10000 # Number of entries
HISTSIZE=10000
HISTFILE=~/.zsh/history # File
setopt APPEND_HISTORY # Don't erase history
setopt EXTENDED_HISTORY # Add additional data to history like timestamp
setopt INC_APPEND_HISTORY # Add immediately
setopt HIST_FIND_NO_DUPS # Don't show duplicates in search
setopt HIST_IGNORE_SPACE # Don't preserve spaces. You may want to turn it off
setopt NO_HIST_BEEP # Don't beep
setopt SHARE_HISTORY # Share history between session/terminals


16

これを行うには、次の行を2行追加する必要があります~/.bashrc

shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"

からman bash

histappendシェルオプションが有効になっている場合(以下のSHELL BUILTINコマンドの下のshoptの説明を参照)、行は履歴ファイルに追加されます。それ以外の場合、履歴ファイルは上書きされます。


10

BASHプロンプトを編集して、Muerrが提案した「history -a」および「history -r」を実行できます。

savePS1=$PS1

(あなたが何かを台無しにした場合、それはほとんど保証されています)

PS1=$savePS1`history -a;history -r`

(これらはバックティックであることに注意してください。すべてのプロンプトでhistory -aおよびhistory -rを実行します。テキストを出力しないため、プロンプトは変更されません。

PS1変数を希望どおりに設定したら、〜/ .bashrcファイルに永続的に設定します。

テスト中に元のプロンプトに戻りたい場合は、次を実行します。

PS1=$savePS1

私はこれについて基本的なテストを行って、動作することを確認しましたがhistory -a;history -r、すべてのプロンプトで実行することによる副作用について話すことはできません。


2
kchのソリューションは、私のものよりもうまく機能します。現在、彼のソリューションを.bashrcで使用しています。

9

以下の問題も解決するbashまたはzsh履歴同期ソリューションが必要な場合は、http://ptspts.blogspot.com/2011/03/how-to-automatically-synchronize-shell.htmlで参照してください。

問題は次のとおりです。2つのシェルウィンドウAとBがあります。シェルウィンドウAでを実行しsleep 9999、シェルウィンドウBで(スリープが終了するのを待たずに)sleep 9999bash履歴で確認できるようにします。

他のほとんどのソリューションはここに、この問題を解決することはできません理由は、彼らが使用して履歴ファイルへの彼らの歴史の変更を書いているということであるPROMPT_COMMANDか、PS1後にのみ、手遅れ実行され、どちらも、sleep 9999コマンドが終了しました。


1
これは良い解決策ですが、いくつか質問がありました。1.元の.bash_historyファイルを使用できますか。$ HOMEに別のbash履歴ファイルが存在することは望ましくありません。2。このためにgithubリポジトリを設定することを検討してください。
-weynhamz

デバッグフックはbashdbと競合しているようです。bashセッションを開始するたびに出力がフォローされます。`` `bashデバッガー、bashdb、リリース4.2-0.8 Copyright 2002、2003、2004、2006、2007、2008、2009、2010、2011 Rocky Bernsteinこれはフリーソフトウェアであり、GNU General Public Licenseで保護されています。特定の条件下でそれを変更および/またはコピーを配布します。**内部デバッグエラー_Dbg_is_file():ファイル引数null bash:_Dbg_filenames [$ fullname]:不正な配列添え字 `` `
weynhamz

@Techlive Zheng:1. .merged_bash_historyは異なるファイル形式を使用しているため、元の.bash_historyは意図的にサポートされていません。設計による堅牢性はそのまま維持されます。2. githubリポジトリは一般に良いアイデアですが、このプロジェクトのためにそれを維持する時間がないので、私はそれをしていません。-はい、bashdbと競合し、簡単な解決策はありません(同じフックを使用します)。修正に取り組むつもりはありませんが、パッチを受け入れています。
pts

大丈夫ありがとう。私は、はるかにシンプルで優れたスロチオンを思いつきました。
-weynhamz

@TechliveZheng:シンプルで優れたソリューションを私たちと共有してください。私たち全員がそれから学ぶことができますか?(もしそうなら、質問への答えを追加してください。)
pts

8

を使用history -aして、現在のセッションの履歴をhistfileに追加してからhistory -r、他の端末でhistfileを読み取るために使用できます。 


8

そうです、最後にこれがきちんとした解決策を見つけるのを悩ませました:

# Write history after each command
_bash_history_append() {
    builtin history -a
}
PROMPT_COMMAND="_bash_history_append; $PROMPT_COMMAND"

これが行うことは、このスレッドで言われたことの一種の融合です。ただし、すべてのコマンドの後にグローバル履歴をリロードする理由がわかりません。私は他の端末で何が起こるかについてほとんど気にしませんが、私は常に一連のコマンドを実行します。

make
ls -lh target/*.foo
scp target/artifact.foo vm:~/

(簡単な例)

そして別の:

pv ~/test.data | nc vm:5000 >> output
less output
mv output output.backup1

まさか、コマンドを共有したくない


1
すべてのコマンドの後に履歴をリロードする理由は、それが質問に必要な動作であるためです(したがって、これは実際に提示された質問に答えません)。
マイケルホーマー

2
@MichaelHomerフェアポイント。自由に投票して、答えが一番下にとどまるようにしてください。ただし、要求された動作がどれほど悪いかを理解していないOPにこれをチョークで書きます。
ヤレックT

3
ええ、それは公正な妥協案です。私の主な不満は、私が歴史を失っていたことです。これは、同時セッション間での即時更新を意味しない場合でも、それを停止する必要があります。
オリ

7

ここで私が使用する代替案があります。面倒ですが、@ axel_cが各端末に個別の履歴インスタンス(make、監視、vimなど)を別々に作成したい場合があるという問題に対処します。

常に更新する別の追加履歴ファイルを保持します。私は次のものをホットキーにマッピングしています:

history | grep -v history >> ~/master_history.txt

これにより、現在の端末からのすべての履歴が、ホームディレクトリのmaster_history.txtというファイルに追加されます。

マスター履歴ファイルを検索するための別のホットキーもあります。

cat /home/toby/master_history.txt | grep -i

猫を使う| grepは、カーソルを最後に残して正規表現を入力するためです。これを行うlessい方法は、これらのタスクを実行するためにパスにいくつかのスクリプトを追加することですが、ホットキーは私の目的のために機能します。また、作業した他のホストから定期的に履歴を取得し、その履歴をmaster_history.txtファイルに追加します。

使用したトリッキーな正規表現や、7か月前に思いついた奇妙なperlのワンライナーをすばやく検索して見つけることができるのはいつでも素晴らしいことです。


6

最後の修正を提供できます。env変数HISTCONTROLが「ignorespace」(または「ignoreboth」)を指定していないことを確認してください。

しかし、複数の同時セッションであなたの痛みを感じます。それは単にbashでうまく処理されていません。


6

@lesmanaの回答に対する私の拡張機能を次に示します。主な違いは、同時ウィンドウは履歴を共有しないことです。つまり、他のウィンドウのコンテキストを現在のウィンドウにロードせずに、ウィンドウで作業を続けることができます。

明示的に「history」と入力した場合、または新しいウィンドウを開いた場合、以前のすべてのウィンドウから履歴を取得します。

また、この戦略を使用して、マシンで入力したすべてのコマンドをアーカイブします。

# Consistent and forever bash history
HISTSIZE=100000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
}

_bash_history_sync_and_reload() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

history() {                  #5
  _bash_history_sync_and_reload
  builtin history "$@"
}

export HISTTIMEFORMAT="%y/%m/%d %H:%M:%S   "
PROMPT_COMMAND='history 1 >> ${HOME}/.bash_eternal_history'
PROMPT_COMMAND=_bash_history_sync;$PROMPT_COMMAND

5

複数の人が同じサーバーで作業できるように、各セッションのコマンドを分離すると監査が容易になるため、履歴をttyごとに記録することを選択しました。

# Convert /dev/nnn/X or /dev/nnnX to "nnnX"
HISTSUFFIX=`tty | sed 's/\///g;s/^dev//g'`
# History file is now .bash_history_pts0
HISTFILE=".bash_history_$HISTSUFFIX"
HISTTIMEFORMAT="%y-%m-%d %H:%M:%S "
HISTCONTROL=ignoredups:ignorespace
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=5000

履歴は次のようになりました。

user@host:~# test 123
user@host:~# test 5451
user@host:~# history
1  15-08-11 10:09:58 test 123
2  15-08-11 10:10:00 test 5451
3  15-08-11 10:10:02 history

ファイルは次のようになります。

user@host:~# ls -la .bash*
-rw------- 1 root root  4275 Aug 11 09:42 .bash_history_pts0
-rw------- 1 root root    75 Aug 11 09:49 .bash_history_pts1
-rw-r--r-- 1 root root  3120 Aug 11 10:09 .bashrc

3

ここで私は1つの問題を指摘します

export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

そして

PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"

source〜/ .bashrcを実行すると、$ PROMPT_COMMANDは次のようになります

"history -a; history -c; history -r history -a; history -c; history -r"

そして

"history -a; history -n history -a; history -n"

この繰り返しは、「source〜/ .bashrc」を実行するたびに発生します。「echo $ PROMPT_COMMAND」を実行して、「source〜/ .bashrc」を実行するたびにPROMPT_COMMANDを確認できます。

「history -n history -a」というコマンドが破損しているように見えることがあります。しかし、良いニュースは、他の部分がまだ有効なコマンドシーケンスを形成しているため、まだ機能することです(一部のコマンドを繰り返し実行するため、多少のコストがかかります。それほどきれいではありません)。

個人的には、次の簡単なバージョンを使用します。

shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r"

上記のような問題はありませんが、ほとんどの機能を備えています。

もう1つのポイントは、魔法は何もないということです。PROMPT_COMMANDは単なるbash環境変数です。その中のコマンドは、bashプロンプト($記号)を取得する前に実行されます。たとえば、PROMPT_COMMANDは「echo 123」で、ターミナルで「ls」を実行します。効果は、「ls; echo 123」を実行するようなものです。

$ PROMPT_COMMAND="echo 123"

出力( 'PROMPT_COMMAND = "echo 123"; $ PROMPT_COMMAND'を実行するように):

123

以下を実行します。

$ echo 3

出力:

3
123

「history -a」は、メモリ内の履歴コマンドを〜/ .bash_historyに書き込むために使用されます

「history -c」は、メモリ内の履歴コマンドをクリアするために使用されます

「history -r」は、〜/ .bash_historyからメモリへの履歴コマンドの読み取りに使用されます

ここで履歴コマンドの説明を参照してください:http : //ss64.com/bash/history.html

PS:他のユーザーが指摘したように、エクスポートは不要です。参照:.bashrcでのエクスポートの使用


2

セッションまたはタスクごとに履歴ファイルを設定するためのスクリプトを作成しましたが、これは以下に基づいています。

        # write existing history to the old file
        history -a

        # set new historyfile
        export HISTFILE="$1"
        export HISET=$1

        # touch the new file to make sure it exists
        touch $HISTFILE
        # load new history file
        history -r $HISTFILE

すべての履歴コマンドを保存する必要はありませんが、関心のあるコマンドを保存し、すべてのコマンドを実行するよりも簡単に取得できます。私のバージョンでは、すべての履歴ファイルもリストされ、それらすべてを検索する機能が提供されます。

完全なソース:https : //github.com/simotek/scripts-config/blob/master/hiset.sh


2

以下、個々のセッションの履歴を混同しないソリューションです!

基本的には、各セッションの履歴を個別に保存し、プロンプトごとに再作成する必要があります。はい、それはより多くのリソースを使用しますが、聞こえるほど遅くはありません-遅延は100000以上の履歴エントリがある場合にのみ顕著になります。

コアロジックは次のとおりです。

# 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

いくつかの安全対策とパフォーマンスの最適化を含む完全なソリューションについては、この要点を参照してください。


1

これはZSHで機能します

##############################################################################
# History Configuration for ZSH
##############################################################################
HISTSIZE=10000               #How many lines of history to keep in memory
HISTFILE=~/.zsh_history     #Where to save history to disk
SAVEHIST=10000               #Number of history entries to save to disk
#HISTDUP=erase               #Erase duplicates in the history file
setopt    appendhistory     #Append history to the history file (no overwriting)
setopt    sharehistory      #Share history across terminals
setopt    incappendhistory  #Immediately append to the history file, not just when a term is killed

残念ながら、質問はbashに限定されています:-)
Jaleks

1
私もzshを検索したときのGoogleでの最初の結果...それが役立つかもしれないと思った
-Mulki

3
まだ存在しないと仮定して、〜「複数のターミナルウィンドウでzsh履歴を保持する」という新しい質問をする必要があります。良い質問であれば、あなた自身の質問に答えても大丈夫です。
オリ

1

特に、新しいプロジェクトで再実行する(またはコマンドでディレクトリを見つける)ために実行された場所でコマンドを取得する機能が必要でした。そこで、このツールをまとめました。これは、グローバルCLI履歴を保存するための以前のソリューションと、percol(C ^ Rにマッピング)と呼ばれる対話型greppingツールを組み合わせたものです。私が使い始めた最初のマシンではまだ滑らかで、2年以上前のCLI履歴があります。

矢印キーに関する限り、ローカルCLI履歴を混乱させませんが、グローバル履歴に非常に簡単にアクセスできます(C ^ R以外にマップすることもできます)


これはzsh用ですか?
sjas

1
はい、最初にzsh用に作成しました。ただし、bashとfishでも機能します。動作するかどうかを教えてください。私はしばらくそれを変更していないと私は私のインストールの指示にしてきた方法を明確にわからない
ゴードン・ウェルズ


-1

ここに私の.bashrcからの抜粋と必要な場所での短い説明があります:

# The following line ensures that history logs screen commands as well
shopt -s histappend

# This line makes the history file to be rewritten and reread at each bash prompt
PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"
# Have lots of history
HISTSIZE=100000         # remember the last 100000 commands
HISTFILESIZE=100000     # start truncating commands after 100000 lines
HISTCONTROL=ignoreboth  # ignoreboth is shorthand for ignorespace and     ignoredups

HISTFILESIZEとHISTSIZEは個人的な好みであり、好みに応じて変更できます。

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