делиться или синхронизировать историю между Zsh и Bash

12

Я часто переключаюсь между Bash и Zsh и использую функцию поиска по истории для восстановления команды.

Однако, поскольку Bash и Zsh имеют разные файлы истории, я часто обнаруживаю, что команда, которую я ищу, была выполнена в другой оболочке.

Есть ли способ поделиться или синхронизировать историю между ними?

Андрей
источник
1
Синтаксис bash и zsh достаточно разный, поэтому вы получите множество команд, которые не работают при копировании в другую оболочку.
Жиль "ТАК - перестань быть злым"

Ответы:

10

Если вы используете значения по умолчанию для bash и zsh:

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

Теперь у вас есть один и тот же файл для истории в обеих оболочках.

Руфо Эль Магуфо
источник
2
Это действительно работает? Два файла истории имеют совершенно разные форматы!
Нил Трафт
1
Да, обе оболочки используют один и тот же формат. Одна команда на строку.
Руфо эль Магуфо
3
У моей .zsh_history есть такие строки, как у : 1399608924:0;hg diffмоей .bash_history просто hg diff. Может это потому, что я пользуюсь oh-my-zsh?
Нил Трэфт,
Может быть. Или какой-то вариант зш. Я не знаю.
Руфо Эль Магуфо
4
вам нужно сделать, unsetopt EXTENDED_HISTORYчтобы получить bash-совместимую историю только для команд.
Матия Налис
2

Не совсем то, что вы искали, но для импорта из 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);
});

Источник

Elad
источник
1

В ответ на 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);
});
Билли
источник