ZshとBashの間の履歴の共有または同期

ZshとBashの間の履歴の共有または同期

私はしばしばBashとZshを切り替え、履歴検索機能を使用してコマンドを回復することを発見します。

しかし、BashとZshは異なる履歴ファイルを持っているので、私が探しているコマンドがすでに別のシェルで実行されていることがよくあります。

2つの間で履歴を共有または同期する方法はありますか?

答え1

Bashとzshにデフォルト値を使用する場合:

$ cat ~/.histfile >> ~/.bash_history
$ youreditor ~/.zshrc
# Here change your config to:
HISTFILE=~/.bash_history
$ rm ~/.histfile

これで、両方のシェルに同じ履歴ファイルがあります。

答え2

Eladに応答して、人々は(#)で始まり、その後に数字(123456789)が続く各コマンドの前に追加の行を含む.bash_historyファイルを持つことができます(例:#123456789)。 bash_historyファイルにこれらの追加行がある場合は、Eladコードの修正バージョンを使用して、きれいなzsh形式の履歴を処理して使用してください。迅速な変換コードを提供してくれたEladに感謝します。

/*
 * You should backup your .bash_history file first doing this:
 * $ cp ~/.bash_history ~/.bash_history.backup
 * 
 * create the .js file to use first:
 * $ touch ~/.bash-history-to-zsh-history.js
 *
 * This is how I use it based on Elads example:
 * $ node ~/.bash-history-to-zsh-history.js >> ~/.zsh_history
 *
 **/

var fs = require("fs");
var a = fs.readFileSync(".bash_history");
var time = Date.now();
a.toString().split("\n").forEach(function(line){
  if (line.indexOf("#")!=0) console.log(": "+ (time++) + ":0;"+line);
});

答え3

正確には必要ではありませんが、bashからzshにインポートするには、次のnode.jsスクリプトを使用できます。

// This is how I used it:
// $ node bash-history-to-zsh-history.js >> ~/.zsh_history

var fs = require("fs");
var a = fs.readFileSync(".bash_history");
var time = Date.now();
a.toString().split("\n").forEach(function(line){
  console.log(": "+ (time++) + ":0;"+line);
});

源泉

答え4

Bashとzshは共有可能$HISTFILE

でbashとzsh入力しますbash。現在の設定では、bashは+(return)Ctrlを押した後にのみ履歴を保存します。Dzsh

bashとzshの構文はあまりにも異なるため、他のシェルにコピーすると、うまくいかないコマンドがたくさん生成されます。

私にとっては、ほとんどのコマンドが機能しますが、タイムスタンプに注意する必要があります。 +を押すと
echo '14:56'作成された時間は.zsh_history2022-01-11 14:57です。CtrlD

Pass peco、記録を取得します。

^*_*^  > \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}\s{2}                                                                     Regexp [1987 (1/67)]
2022-01-11 14:57  e .zsh_history
2022-01-11 14:55  bash
2022-01-11 14:57  echo '14:56'
2022-01-11 14:57  echo  $HISTFILE
2022-01-11 14:57  print  $HISTFILE
2022-01-11 14:57  print -l $HISTFILE
2022-01-11 14:57  e .zsh_history
2022-01-11 14:57  ls
2022-01-11 14:55  history -i -n 1 | le
2022-01-11 14:55  ~
2022-01-11 14:55  -

内部に.zsh_history

: 1641884226:0;ls
: 1641884234:17;e .zsh_history
print -l $HISTFILE
print  $HISTFILE
echo  $HISTFILE
echo '14:56'
: 1641884154:100;bash
: 1641884257:9;e .zsh_history
: 1641884338:0;e .zsh_history
: 1641880817:3534;e history_config_wf.zsh
: 1641884353:0;~

私の設定peco.zshrc):

BUFFER=$(history -i -2000 | eval $tac | cut -c 8- | peco --initial-filter="Regexp" --query "\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}\\s{2} $BUFFER") 

関連情報