我经常发现自己在 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
,我输入bash
bash。在我当前的设置下,bash 仅在按Ctrl+后保存历史记录D(返回zsh
)
bash 和 zsh 的语法差异很大,以至于您最终会得到许多在复制到另一个 shell 时不起作用的命令
对我来说,大多数命令都有效,但我们应该注意时间戳:当我按+时,
echo '14:56'
写入时间为.zsh_history
2022-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")