Tout d'abord, il ne s'agit pas d'un duplicata d'aucun thread existant sur SE. J'ai lu ces deux discussions ( 1ère , 2ème ) sur une meilleure histoire de Bash, mais aucune des réponses ne fonctionne - - je suis sur Fedora 15 d'ailleurs.
J'ai ajouté ce qui suit au .bashrc
fichier dans le répertoire utilisateur (/ home / aahan /), et cela ne fonctionne pas. Quelqu'un a un indice?
HISTCONTROL=ignoredups:erasedups # no duplicate entries
HISTSIZE=1000 # custom history size
HISTFILESIZE=100000 # custom history file size
shopt -s histappend # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" # Save and reload the history after each command finishes
Ok c'est ce que je veux avec l'historique bash (priorité):
- ne stocke pas les doublons, efface les existants
- partager immédiatement l'historique avec tous les terminaux ouverts
- toujours ajouter l'histoire, pas l'écraser
- stocke les commandes multi-lignes en une seule commande (désactivée par défaut)
- Quelle est la taille de l'historique et la taille du fichier d'historique par défaut?
bash
command-history
c'est moi
la source
la source
echo $SHELL
) Les paramètres fonctionnent-ils si vous les exécutez manuellement à partir de votre shell ouvert? Évidemment, comme ils fonctionnent pour tant d’autres, les réglages sont corrects, vous ne les implémentez pas. Et aucune Fedora15 / Gnome3 / être une machine virtuelle n’a que peu à voir avec la fonction réelle debash
..bashrc
fichier. Est-ce faux? Pouvez-vous ajouter une "réponse" à ce message avec les commandes du shell? (s'il vous plaît supporter avec ma noob-ity.).bashrc
des commandes shell ARE. Les scripts ne sont que des séries de commandes shell. De plus, le montage que vous avez récemment fait en supprimant leexport
bit était une mauvaise idée, qui devrait être conservée.Réponses:
C’est un comportement vraiment intéressant et j’avoue que j’ai largement sous-estimé la question au début. Mais d'abord les faits:
1. Qu'est-ce qui fonctionne
La fonctionnalité peut être obtenue de plusieurs manières, bien que chacune fonctionne un peu différemment. Notez que, dans chaque cas, pour que l'historique soit "transféré" vers un autre terminal (mis à jour), il faut appuyer Enterdans le terminal sur lequel il souhaite récupérer l'historique.
Option 1:
Cela a deux inconvénients:
Option 2:
(Oui, pas besoin
shopt -s histappend
et oui, il doit êtrehistory -c
au milieu dePROMPT_COMMAND
) Cette version présente également deux inconvénients importants:history
commande peut donner un faux résultat - voir ci-dessous.[Edit] "Et le gagnant est ..."
option 3:
Ceci est aussi loin que possible. C’est la seule option possible pour que les deux
erasedups
et l’histoire commune fonctionnent simultanément. C'est probablement la solution finale à tous vos problèmes, Aahan.2. Pourquoi l' option 2 ne semble pas fonctionner (ou: qu'est - ce qui ne fonctionne pas comme prévu)?
Comme je l'ai mentionné, chacune des solutions ci-dessus fonctionne différemment. Mais l'interprétation la plus trompeuse du fonctionnement des paramètres provient de l'analyse du résultat de la
history
commande . Dans de nombreux cas, la commande peut donner une sortie erronée . Pourquoi? Parce qu'il est exécuté avant la séquence des autreshistory
commandes contenues dans lePROMPT_COMMAND
fichier! Cependant, lorsque vous utilisez la deuxième ou la troisième option, vous pouvez surveiller les modifications de.bash_history
contenu (en utilisantwatch -n1 "tail -n20 .bash_history"
par exemple) et voir quel est l'historique réel.3. Pourquoi l' option 3 est-elle si compliquée?
Tout se trouve dans la façon dont
erasedups
fonctionne. Comme l'indique le manuel bash, "(...)erasedups
supprime toutes les lignes précédentes correspondant à la ligne actuelle de la liste de l'historique avant que cette ligne ne soit enregistrée" . Donc, c’est vraiment ce que le PO souhaitait (et pas simplement, comme je le pensais précédemment, ne pas avoir de doublons apparaissant dans l’ordre ) . Voici pourquoi chacune deshistory -.
commandes doit ou ne peut pas être dans lePROMPT_COMMAND
:history -n
doit être là avanthistory -w
de lire.bash_history
les commandes sauvegardées de n’importe quel autre terminal,history -w
doit être présent pour sauvegarder l’historique dans le fichier et effacer les doublons,history -a
ne doit pas être placé là au lieu dehistory -w
, car cela ne déclenche pas l’effacement des doublons,history -c
est également nécessaire car il évite de détruire le tampon d’historique après chaque commande,et enfin,
history -r
est nécessaire pour restaurer le tampon d’historique à partir d’un fichier, rendant ainsi l’historique partagé entre les sessions de terminal.la source
watch "tail -n 20 .bash_history"
place dutail -f .bash_history
.history -c
est également nécessaire car il empêche la suppression du tampon de l'historique après chaque commande. Pourquoi cette suppression se produit-elle?Dans votre commande d'invite, vous utilisez le
-c
commutateur. Deman bash
:Pour partager votre historique avec tous les terminaux ouverts, vous pouvez utiliser
-n
:La taille par défaut est également dans le manuel:
Pour enregistrer des commandes multilignes:
En outre, vous ne devriez pas préfacer les commandes HIST * avec
export
- ce sont des variables uniquement bash et non des variables environnementales:HISTCONTROL=ignoredups:erasedups
est suffisant.la source
export PROMPT_COMMAND="history -a; history -n; history -r; $PROMPT_COMMAND"
c'est correct? En outre, savez-vous comment je peux créer des commandes multilignes en tant que commande unique (qui est désactivée par défaut)?shopt -s cmdhist
économiserez plusieurs lignes.HISTCONTROL=ignoredups:erasedups
ne marche pas. J'ai aussi essayé d'avoir cela dans le.bashrc
fichier (parmi les fonctions personnalisées). Une idée de ce qui pourrait être faux? J'utilise Fedora 15 sur une machine virtuelle - - Hôte Windows 7./etc/bashrc
,.bash_profile
etc., qui le remplace..bash_profile
fichier. En ce qui concerne le contenu,/etc/bashrc
je le mets ici, jetez un coup d’œil - pastebin.com/Uae6sE6sC’est ce que j’ai trouvé et j'en suis heureux jusqu’à présent…
REMARQUES:
HISTIGNORE
ignore toutes les commandes sans arguments. Cela peut ne pas être souhaitable pour certaines personnes et peut être laissé de côté.la source
Utilisez ceci à la place:
la source
Cela ne fonctionne pas, car vous oubliez:
Mais il semble que ce
history -n
soit simplement un buggy quand ilexport HISTCONTROL=ignoreboth:erasedups
est en vigueur.Permet d'expérimenter:
Ici, nous activons l’effacement des doublons, commutons l’historique en fichier personnalisé, effaceons l’historique. Une fois toutes les commandes terminées, nous avons un fichier d’historique vide et une commande dans l’historique actuel.
Ouvrez le deuxième terminal et exécutez ces six commandes aussi. Après ça:
Maintenant, votre historique actuel a deux commandes et le fichier d’historique a:
Retour au premier terminal:
Euh ... aucune des
echo
commandes n'est lue. Passez à nouveau au deuxième terminal et:Maintenant le fichier historique est:
Revenez au premier terminal:
Vous pouvez voir que cette
echo "Z"
commande est fusionnéehistory -n
.Un autre bogue est dû au fait que les commandes sont lues dans l'historique par numéro de commande et non par heure de commande, je pense. J'espère que d'autres
echo
commandes sont apparues dans l'historiquela source
effacé ne supprime pas (comme chomp dans certaines langues) les espaces de début et de fin. C'est un bug. De même, effacé ne supprime pas toutes les entrées précédentes.
la source