partage ou synchronisation de l'historique entre Zsh et Bash

12

Je me retrouve souvent à basculer entre Bash et Zsh et à utiliser la fonctionnalité de recherche d'historique pour récupérer une commande.

Cependant, comme Bash et Zsh ont des fichiers d'historique différents, je trouve souvent que la commande que je recherche a été exécutée dans l'autre shell.

Existe-t-il un moyen de partager ou de synchroniser l'historique entre les deux?

Andrei
la source
1
La syntaxe de bash et zsh est suffisamment différente pour que vous vous retrouviez avec de nombreuses commandes qui ne fonctionnent pas lorsqu'elles sont copiées dans l'autre shell.
Gilles 'SO- arrête d'être méchant'

Réponses:

10

Si vous utilisez les valeurs par défaut pour bash et zsh:

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

Vous avez maintenant le même fichier d'historique dans les deux shells.

Rufo El Magufo
la source
2
Est-ce que cela fonctionne vraiment? Les deux histfiles ont des formats complètement différents!
Neil Traft du
1
Oui, les deux coques utilisent le même format. Une commande par ligne.
Rufo El Magufo
3
Mon .zsh_history a des lignes comme : 1399608924:0;hg diffalors que mon .bash_history a simplement hg diff. C'est peut-être parce que j'utilise oh-my-zsh?
Neil Traft
Peut être. Ou une option de zsh. Je ne sais pas.
Rufo El Magufo
4
vous devez faire unsetopt EXTENDED_HISTORYpour obtenir l'historique des commandes uniquement compatible avec bash.
Matija Nalis
2

Pas exactement ce que vous cherchiez, mais pour importer de bash vers zsh, vous pouvez utiliser ce script 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);
});

La source

Elad
la source
1

En réponse à Elad, les gens peuvent avoir des fichiers .bash_history qui ont une ligne supplémentaire avant chaque commande qui commence par (#) et dont les derniers chiffres suivent (123456789), par exemple: # 123456789. Si votre fichier bash_history contient ces lignes supplémentaires, utilisez cette version modifiée du code d'Elad pour traiter un historique au format zsh propre à utiliser. Merci Elad pour le code de conversion rapide.

/*
 * 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);
});
Gamelle
la source