web-dev-qa-db-fra.com

Il manque la moitié de l'histoire de bash

L'autre soir, je lisais AU Q & A et utilisais une commande bash:

inxi -????

Le problème est qu'aujourd'hui je ne me souviens pas des caractères comprenant ????. Je veux mettre la commande et les paramètres dans mon tableur de documentation. Sur la base de cette réponse ( Comment rappeler l’historique en temps réel ) j’ai utilisé cette commande:

$ cat .bash_history | grep inxi
inxi -b
Sudo apt install inxi
inxi -b

Cependant, la commande que je veux n’existe pas, même si l’histoire est très ancienne. J'ai utilisé les commandes inxi plusieurs fois dans le terminal depuis cette ancienne histoire, mais aucune d'entre elles n'apparaît.

J'ai aussi essayé Ctrl+R+inxi sans aucune chance. Parce que j'ouvre plusieurs fenêtres de terminal tout le temps, l'histoire est-elle liée à une fenêtre spécifique?

Existe-t-il un moyen différent de grep fichier (s) d'historique bash?

Notez que je ne préfixe pas les commandes de terminal avec un Space Bar tels qu'ils sont supprimés de l'histoire.

6
WinEunuuchs2Unix

Je ne peux pas savoir ce qui s'est passé sans l'accès à votre machine, mais voici une brève explication du fonctionnement du système d'historique qui pourrait vous aider à comprendre ce qui s'est passé.

Chaque terminal ouvert a son propre tampon d’historique. Ces tampons sont ajoutés à votre $HISTFILE lorsque le terminal est fermé (peut-être aussi chaque fois que le tampon est rempli, mais je ne sais pas à quelle fréquence cela se produit). Maintenant, le moyen de rechercher une commande dans votre historique est d’exécuter simplement:

history | grep command

Mais si la commande a été exécutée dans un autre shell, vous ne la verrez pas dans l'historique de votre version actuelle. Pour résoudre ce problème, fermez tous les shells ouverts, ouvrez une nouvelle fenêtre de terminal et effectuez une nouvelle recherche dans votre historique.

Si cela ne vous aide toujours pas, vous avez probablement dépassé le seuil de commandes stockées dans le $HISTFILE. Le comportement de $HISTFILE est contrôlé par diverses variables d’environnement (voir man bash pour la liste complète), mais les plus pertinentes sont les suivantes:

   HISTSIZE
          The  number  of commands to remember in the command history (see HISTORY below).  If the value is 0, commands are not saved in the history list.  Numeric values less than
          zero result in every command being saved on the history list (there is no limit).  The Shell sets the default value to 500 after reading any startup files.

   HISTFILESIZE
          The maximum number of lines contained in the history file.  When this variable is assigned a value, the history file is truncated, if necessary, to contain no  more  than
          that number of lines by removing the oldest entries.  The history file is also truncated to this size after writing it when a Shell exits.  If the value is 0, the history
          file is truncated to zero size.  Non-numeric values and numeric values less than zero inhibit truncation.  The Shell sets the default value to the value of HISTSIZE after
          reading any startup files.

Plus vous leur attribuez des valeurs élevées, plus vous conserverez de commandes dans votre $HISTFILE. Par exemple, j'utilise:

HISTSIZE=999999
HISTFILESIZE=999999

Si vous souhaitez importer l'historique d'un shell dans un autre, vous pouvez utiliser la commande historyname__:

$ help history | grep -E -- '-a|-r'
      -a    append history lines from this session to the history file
      -r    read the history file and append the contents to the history

Exécutez donc history -a pour écrire l’historique d’un terminal, puis history -w pour le lire depuis l’autre. Maintenant, exécuter historyvous montrera l’historique des deux shells.

Enfin, vous pouvez faire en sorte que tous vos terminaux partagent le même historique en ajoutant ces lignes à votre ~/.bashrc:

## history -a causes the last command to be written to the
## history file automatically and history -r imports the history
export Prompt_COMMAND='history -a;history -r'

Je vous suggère également d'ajouter ceci:

## Make Bash append rather than overwrite the history on disk:
shopt -s histappend
6
terdon

Votre commande a fonctionné pour moi ...

$ cat .bash_history | grep inxi
inxi -b
Sudo apt install inxi
inxi -b
inxi -Fxz -c 0 > inxi_list.txt
inxi -Fxz
inxi -Fxz
Sudo inxi -Fxz

Je copie aussi périodiquement l’historique dans un fichier et le sauvegarde.

history > history_$(date '+%Y-%m-%d_%H:%M:%S')_$(hostname).txt
2
oldfred