udostępnianie lub synchronizowanie historii między Zsh i Bash

12

Często przełączam się między Bash i Zsh i używam funkcji wyszukiwania historii, aby odzyskać polecenie.

Ponieważ jednak Bash i Zsh mają różne pliki historii, często okazuje się, że polecenie, którego szukam, zostało wykonane w innej powłoce.

Czy jest jakiś sposób na udostępnienie lub zsynchronizowanie historii między nimi?

Andrei
źródło
1
Składnia bash i zsh jest na tyle inna, że ​​skończyłoby się to wieloma poleceniami, które nie działają po skopiowaniu do drugiej powłoki.
Gilles „SO- przestań być zły”,

Odpowiedzi:

10

Jeśli używasz wartości domyślnych dla bash i zsh:

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

Teraz masz ten sam plik historii w obu powłokach.

Rufo El Magufo
źródło
2
Czy to naprawdę działa? Te dwa pliki mają zupełnie inne formaty!
Neil Traft,
1
Tak, obie powłoki używają tego samego formatu. Jedno polecenie w wierszu.
Rufo El Magufo
3
Moja .zsh_history ma linie podobne, : 1399608924:0;hg diffpodczas gdy moja .bsh_history ma po prostu hg diff. Może to dlatego, że używam oh-my-zsh?
Neil Traft
Może. Lub jakaś opcja zsh. Nie wiem
Rufo El Magufo
4
musisz zrobić, unsetopt EXTENDED_HISTORYaby uzyskać historię tylko poleceń zgodną z bash.
Matija Nalis
2

Nie dokładnie to, czego szukałeś, ale aby zaimportować z bash do zsh, możesz użyć tego skryptu 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);
});

Źródło

Elad
źródło
1

W odpowiedzi na Elad ludzie mogą mieć pliki .bash_history z dodatkową linią przed każdym poleceniem rozpoczynającym się od (#) i kończącymi się cyframi (123456789), na przykład: # 123456789. Jeśli twój plik bash_history zawiera te dodatkowe wiersze, użyj tej zmodyfikowanej wersji kodu Elad, aby przetworzyć czystą, sformatowaną historię w formacie zsh do użycia. Dzięki Elad za kod szybkiej konwersji.

/*
 * 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);
});
Pałka policjanta
źródło