J'ai toujours plus d'un terminal ouvert. N'importe où de deux à dix, faisant divers morceaux et bobs. Maintenant, disons que je redémarre et ouvre un autre ensemble de terminaux. Certains se souviennent de certaines choses, d'autres oublient.
Je veux une histoire qui:
- Se souvient de tout de chaque terminal
- Est instantanément accessible à partir de chaque terminal (par exemple, si je suis
ls
dans un, passez à un autre terminal déjà en marche puis appuyez sur le haut,ls
s'affiche) - N'oubliez pas la commande s'il y a des espaces à l'avant de la commande.
Tout ce que je peux faire pour que Bash fonctionne plus comme ça?
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
. Les shells existants ajouteront chaque commande au fichier historique pour que les nouveaux shells puissent le voir, mais ne montreront que leurs propres historiques.Réponses:
Ajouter ce qui suit à ~ / .bashrc
la source
history -a
(...) ne provoque pas l’effacement des doublons selon cette réponse à la question Bash history: «ignoredups» et «erasedups» mettant en conflit l’historique des différentes sessions . Cette réponse donne également la séquence dehistory -<option>
commandes qui fonctionne avec leHISTCONTROL=ignoredups:erasedups
réglage.export
les variablesHISTCONTROL
etPROMPT_COMMAND
: vous les définissez dans.bashrc
afin qu'elles soient définies dans chaque shell (même dans les non-interactives, ce qui est également inutile).Donc, tout cela est lié à mon histoire
.bashrc
:Testé avec bash 3.2.17 sur Mac OS X 10.5, bash 4.1.7 sur 10.6.
la source
sleep 9999
et (sans attendre la fin du sommeil) dans la fenêtre shell B, je veux pouvoir voirsleep 9999
l'historique Bash.href
qui actualise instantanément l'historique de mon terminal actuel et nettoie le fichier d'historique. Chaque fois que j'ouvre un nouveau terminal, ce nettoyage / synchronisation est exécuté dans mon fichier bashrc afin que le nouveau terminal possède l'historique le plus récent. J'utilise cela avechistory -a
export
variables: vous les définissez de.bashrc
manière à ce qu'elles soient définies dans chaque shell (même dans les non-interactives, ce qui représente également un gaspillage de ressources)Voici ma tentative de partage de l'historique de session Bash. Cela permettra le partage de l'historique entre les sessions bash de manière à ce que le compteur d'historique ne soit pas mélangé et que l'expansion de l'historique
!number
ne fonctionne pas (avec certaines contraintes).Utilisation de Bash version 4.1.5 sous Ubuntu 10.04 LTS (Lucid Lynx).
Explication:
Ajoute la ligne qui vient d'être entrée à la
$HISTFILE
(valeur par défaut.bash_history
). Cela fera$HISTFILE
croître d'une ligne.Si vous définissez la variable spéciale
$HISTFILESIZE
sur une valeur quelconque, Bash ne tronquera$HISTFILE
pas plus de$HISTFILESIZE
lignes en supprimant les entrées les plus anciennes.Effacer l'historique de la session en cours. Cela réduira le compteur d'historique du montant de
$HISTSIZE
.Lisez le contenu de
$HISTFILE
et insérez-le dans l'historique de la session en cours. cela relèvera le compteur d’histoire du nombre de lignes contenues$HISTFILE
. Notez que le nombre de lignes de$HISTFILE
n'est pas nécessairement$HISTFILESIZE
.La
history()
fonction remplace l'historique intégré pour s'assurer que l'historique est synchronisé avant qu'il ne soit affiché. Ceci est nécessaire pour l’extension de l’historique par numéro (plus à ce sujet plus tard).Plus d'explication:
L'étape 1 garantit que la commande de la session en cours d'exécution est écrite dans le fichier historique global.
L'étape 4 garantit que les commandes des autres sessions sont lues dans l'historique de la session en cours.
L'étape 4 augmentant le compteur d'historique, nous devons le réduire d'une manière ou d'une autre. Ceci est fait à l'étape 3.
À l'étape 3, le compteur d'historique est réduit de
$HISTSIZE
. À l'étape 4, le compteur d'historique est généré par le nombre de lignes insérées$HISTFILE
. À l'étape 2, nous nous assurons que le nombre de lignes de$HISTFILE
est exactement$HISTSIZE
(cela signifie que cela$HISTFILESIZE
doit être identique à$HISTSIZE
).A propos des contraintes de l'expansion de l'histoire:
Lorsque vous utilisez l’extension d’historique par numéro, vous devez toujours rechercher le numéro immédiatement avant de l’utiliser. Cela signifie qu'aucune invite bash ne s'affiche entre la recherche du numéro et son utilisation. Cela signifie généralement pas d'entrée et pas de ctrl + c.
En règle générale, une fois que vous avez plus d'une session Bash, rien ne garantit qu'une extension d'historique numérotée conserve sa valeur entre deux affichages d'invite Bash. Parce que quand
PROMPT_COMMAND
est exécuté, l'historique de toutes les autres sessions Bash est intégré à l'historique de la session en cours. Si une autre session bash a une nouvelle commande, les numéros d'historique de la session en cours seront différents.Je trouve cette contrainte raisonnable. Quoi qu'il en soit, je dois regarder le numéro chaque fois parce que je ne me souviens pas de chiffres historiques arbitraires.
D'habitude j'utilise l'extension d'historique par numéro comme ceci
Je recommande d'utiliser les options suivantes de Bash.
Bugs étranges:
L'exécution de la commande d'historique associée à quoi que ce soit aura pour résultat que cette commande sera répertoriée deux fois dans l'historique. Par exemple:
Tous seront répertoriés dans l'historique deux fois. Je ne sais pas pourquoi.
Idées d'améliorations:
Modifiez la fonction
_bash_history_sync()
pour qu’elle ne s’exécute pas à chaque fois. Par exemple, il ne devrait pas s'exécuter aprèsCTRL+C
l'invite. J'utilise souventCTRL+C
de supprimer une longue ligne de commande quand je décide que je ne veux pas exécuter cette ligne. Parfois, je dois utiliserCTRL+C
pour arrêter un script d'achèvement Bash.Les commandes de la session en cours doivent toujours être les plus récentes de l'historique de la session en cours. Cela aura également pour effet secondaire qu'un numéro d'historique donné conserve sa valeur pour les entrées d'historique de cette session.
la source
history -n
parce que ça dérange le compteur d'historique. En outre, j'ai trouvéhistory -n
trop peu fiable.history -a
, sans-c
et-r
, était plus convivial du point de vue de la convivialité (bien que ce ne soit pas ce que la question demandait). Cela signifie que les commandes que vous exécutez sont disponibles instantanément dans les nouveaux shells avant même de quitter le shell en cours, mais pas dans les shells exécutés simultanément. De cette façon, Arrow-Up sélectionne toujours toujours les commandes de la dernière session de la session en cours , ce que je trouve beaucoup moins déroutant.Je ne suis au courant d'aucune façon d'utiliser
bash
. Mais c'est l'une des fonctionnalités les plus populaires dezsh
.Personnellement, je préfère
zsh
plus,bash
alors je recommande de l'essayer.Voici la partie de mon
.zshrc
qui traite de l'histoire:la source
Pour ce faire, vous devrez ajouter deux lignes à votre
~/.bashrc
:De
man bash
:la source
Vous pouvez modifier votre invite BASH pour exécuter les "history -a" et "history -r" proposés par Muerr:
(au cas où vous gâcher quelque chose, ce qui est presque garanti)
(notez qu'il s'agit de contrôles en arrière-plan; ils exécuteront l'historique -a et l'historique -r à chaque invite. Comme ils ne génèrent aucun texte, votre invite ne sera pas modifiée.
Une fois que vous avez configuré votre variable PS1 comme vous le souhaitez, définissez-la définitivement dans votre fichier ~ / .bashrc.
Si vous souhaitez revenir à votre invite d'origine lors du test, procédez comme suit:
J'ai effectué des tests de base sur cette opération pour vérifier son efficacité, mais je ne peux parler d'aucun effet secondaire résultant de son exécution
history -a;history -r
à chaque invite.la source
Si vous avez besoin d'une solution de synchronisation de l'historique bash ou zsh qui résout également le problème ci-dessous, consultez-la à l' adresse http://ptspts.blogspot.com/2011/03/how-to-automatically-synchronize-shell.html.
Le problème est le suivant: J'ai deux fenêtres de shell A et B. Dans la fenêtre de shell A, je cours
sleep 9999
et (sans attendre la fin du sommeil) dans la fenêtre de shell B, je veux pouvoir voirsleep 9999
l'historique de bash.La plupart des solutions proposées ici ne résoudront pas ce problème car elles écrivent leurs modifications d'historique dans le fichier d'historique en utilisant
PROMPT_COMMAND
ouPS1
, les deux s'exécutant trop tard, uniquement après la fin de lasleep 9999
commande.la source
Vous pouvez utiliser
history -a
pour ajouter l'historique de la session en cours à l'historique, puis utiliserhistory -r
sur les autres terminaux pour lire l'historique.la source
Bon, finalement, cela m'a agacé de trouver une solution décente:
Ce que cela fait est en quelque sorte une fusion de ce qui a été dit dans ce fil, sauf que je ne comprends pas pourquoi rechargerais l'historique global après chaque commande. Je me soucie très rarement de ce qui se passe dans les autres terminaux, mais je lance toujours une série de commandes, disons dans un terminal:
(Exemple simplifié)
Et dans un autre:
Pas question que je veuille que la commande soit partagée
la source
Voici une alternative que j'utilise. C'est fastidieux mais cela résout le problème mentionné par @axel_c: vous souhaiterez parfois avoir une instance d'historique distincte dans chaque terminal (une pour make, une pour la surveillance, une pour vim, etc.).
Je conserve un fichier d'historique annexé distinct que je mets à jour en permanence. J'ai mappé ce qui suit sur un raccourci clavier:
Ceci ajoute tout l'historique du terminal actuel à un fichier appelé master_history.txt dans votre répertoire personnel.
J'ai aussi un raccourci clavier séparé pour rechercher dans le fichier d'historique principal:
J'utilise un chat | grep car il laisse le curseur à la fin pour entrer dans ma regex. Une façon moins laide de le faire serait d’ajouter quelques scripts sur votre chemin pour accomplir ces tâches, mais les raccourcis clavier fonctionnent à mes fins. Je vais aussi périodiquement extraire l'historique des autres hôtes sur lesquels j'ai travaillé et l'ajouter à mon fichier master_history.txt.
Il est toujours agréable de pouvoir rapidement rechercher et trouver cette regex complexe que vous avez utilisée ou cet étrange perl one-liner que vous avez créé il y a 7 mois.
la source
Je peux proposer un correctif pour ce dernier problème: assurez-vous que la variable env HISTCONTROL ne spécifie pas "ignorespace" (ou "ignoreboth").
Mais je ressens votre douleur avec plusieurs sessions simultanées. Ce n'est tout simplement pas bien géré en Bash.
la source
Voici mon amélioration à la réponse de @ lesmana . La principale différence est que les fenêtres simultanées ne partagent pas l'historique. Cela signifie que vous pouvez continuer à travailler dans vos fenêtres sans que le contexte des autres fenêtres ne soit chargé dans vos fenêtres actuelles.
Si vous tapez explicitement 'historique', OU si vous ouvrez une nouvelle fenêtre, vous obtenez l'historique de toutes les fenêtres précédentes.
De plus, j'utilise cette stratégie pour archiver toutes les commandes jamais tapées sur ma machine.
la source
J'ai choisi de mettre l'historique dans un fichier à la fois, car plusieurs personnes peuvent travailler sur le même serveur. La séparation des commandes de chaque session facilite l'audit.
L'histoire ressemble maintenant à:
Avec les fichiers ressemblant à:
la source
Ici, je vais signaler un problème avec
et
Si vous utilisez la source ~ / .bashrc, le $ PROMPT_COMMAND sera comme
et
Cette répétition se produit chaque fois que vous exécutez 'source ~ / .bashrc'. Vous pouvez vérifier PROMPT_COMMAND après chaque fois que vous exécutez 'source ~ / .bashrc' en exécutant 'echo $ PROMPT_COMMAND'.
Vous pouvez voir que certaines commandes sont apparemment brisées: "history -n history -a". Mais la bonne nouvelle est que cela fonctionne toujours, car d'autres pièces forment toujours une séquence de commandes valide (entraînant simplement des coûts supplémentaires en raison de l'exécution répétitive de commandes. Et pas si propre.)
Personnellement j'utilise la version simple suivante:
qui a la plupart des fonctionnalités alors aucun problème tel que mentionné ci-dessus.
Un autre point à souligner est qu’il n’ya vraiment rien de magique . PROMPT_COMMAND n'est qu'une simple variable d'environnement bash. Les commandes qu'il contient sont exécutées avant que vous obteniez prompt bash (le signe $). Par exemple, votre PROMPT_COMMAND est "echo 123" et vous exécutez "ls" dans votre terminal. L'effet est similaire à l'exécution de "ls; echo 123".
output (comme si vous exécutiez 'PROMPT_COMMAND = "echo 123"; $ PROMPT_COMMAND'):
Exécutez ce qui suit:
sortie:
"history -a" est utilisé pour écrire les commandes d'historique en mémoire dans ~ / .bash_history
"history -c" est utilisé pour effacer les commandes d'historique en mémoire
"history -r" est utilisé pour lire les commandes d'historique de ~ / .bash_history dans la mémoire
Voir l'explication des commandes d'historique ici: http://ss64.com/bash/history.html
PS: Comme d'autres utilisateurs l'ont souligné, l' exportation n'est pas nécessaire. Voir: utilisation de l'export dans .bashrc
la source
J'ai écrit un script pour définir un fichier d'historique par session ou tâche, en fonction des éléments suivants.
Il n’est pas nécessaire de sauvegarder toutes les commandes de l’historique, mais il enregistre celles qui me tiennent à cœur et il est plus facile de les récupérer que de passer en revue chaque commande. Ma version répertorie également tous les fichiers d’historique et offre la possibilité de les parcourir tous.
Source complète: https://github.com/simotek/scripts-config/blob/master/hiset.sh
la source
Voici une solution qui ne mélange pas l'historique des sessions individuelles!
Fondamentalement, il faut stocker l'historique de chaque session séparément et le recréer à chaque invite. Oui, il utilise plus de ressources, mais ce n'est pas aussi lent que cela puisse paraître - le retard commence à être perceptible uniquement si vous avez plus de 100 000 entrées dans l'historique.
Voici la logique de base:
Consultez cette synthèse pour une solution complète, comprenant des garanties et des optimisations de performances.
la source
Cela fonctionne pour ZSH
la source
Je voulais depuis longtemps cela, en particulier la possibilité de récupérer une commande en fonction de son exécution afin de l'exécuter à nouveau dans un nouveau projet (ou de rechercher un répertoire à l'aide d'une commande). J'ai donc assemblé cet outil , qui combine les solutions précédentes pour stocker un historique global de la CLI avec un outil de capture interactif appelé percol (mappé sur C ^ R). La première machine que je commence à utiliser est toujours lisse, maintenant avec un historique CLI âgé de plus de 2 ans.
En ce qui concerne les touches fléchées, il ne perturbe pas l’historique local de la CLI, mais vous permet d’accéder assez facilement à l’historique global (que vous pouvez également mapper sur autre chose que C ^ R).
la source
Parce que je préfère une histoire infinie qui est enregistrée dans un fichier personnalisé. Je crée cette configuration sur https://stackoverflow.com/a/19533853/4632019 :
la source
Voici l'extrait de mon .bashrc et de courtes explications là où c'est nécessaire:
HISTFILESIZE et HISTSIZE sont des préférences personnelles et vous pouvez les modifier selon vos goûts.
la source