在 Zsh 和 Bash 之间共享或同步历史记录

在 Zsh 和 Bash 之间共享或同步历史记录

我经常发现自己在 Bash 和 Zsh 之间切换,并使用历史搜索功能来恢复命令。

然而,由于 Bash 和 Zsh 具有不同的历史文件,我经常发现我正在搜索的命令已在另一个 shell 中执行。

有什么方法可以在两者之间共享或同步历史记录吗?

答案1

如果您使用 bash 和 zsh 的默认值:

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

现在,两个 shell 中都有相同的历史记录文件。

答案2

作为对 Elad 的回应,人们可能拥有 .bash_history 文件,这些文件在每个以 (#) 开头的命令之前有一个额外的行,并在后面跟随数字 (123456789),例如:#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

在 中zsh,我输入bashbash。在我当前的设置下,bash 仅在按Ctrl+后保存历史记录D(返回zsh

bash 和 zsh 的语法差异很大,以至于您最终会得到许多在复制到另一个 shell 时不起作用的命令

对我来说,大多数命令都有效,但我们应该注意时间戳:当我按+时,
echo '14:56'写入时间为.zsh_history2022-01-11 14:57 )CtrlD

通过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") 

相关内容