Comment conserver mon historique bash d'une session à l'autre?

26

Je travaille sur une cible x86 sous fedora 9.

Chaque fois que je le redémarre, mon historique revient à un état et je n'ai pas de commandes que j'ai exécutées dans les sessions avant le redémarrage.

Qu'est-ce que je dois changer pour avoir mis à jour l'historique que j'avais avant de redémarrer?

BЈовић
la source
Il demande "Comment puis-je conserver mon historique bash d'une session à l'autre?", Ce qui est lié à la programmation shell. Le redémarrage est un moyen dramatique de perdre votre shell, c'est tout. Il n'est pas nécessaire de clore le sujet.
Jonathan Leffler
Bon point - cela devrait probablement être déplacé vers SuperUser.
BR
@ Jonathan Oui, vous avez la bonne question. Je ne savais pas quoi demander exactement.
L'enregistrement de chaque commande juste après son exécution ne sera pas utile à la fin de la session. En effet, si vous exécutez deux sessions simultanément, sans la ligne ci-dessous, bash enregistrera l'historique de la session-1 (par exemple) à la fermeture. Si session-1 est en cours d'exécution et que vous souhaitez accéder immédiatement à l'historique de session-1 dans session-2, vous ne pourrez le faire que si vous ajoutez la ligne ci-dessous au fichier .bashrc. PROMPT_COMMAND = 'historique -a'
Abhinav

Réponses:

16

Quelle histoire? bash-histoire? Si vous perdez l'historique bash et que vous avez plusieurs sessions à la fois, c'est parce que chaque session écrase l'historique des autres sessions.

Vous voudrez probablement dire à bash de ne pas écraser l’historique à chaque fois, mais plutôt de l’ajouter. Vous pouvez le faire en modifiant votre .bashrc à exécuter shopt -s histappend.

Vous pouvez également augmenter la taille de votre fichier d’historique en exportant HISTSIZE afin qu’il s’agisse d’un nombre important (c’est en octets, donc 100 000 devrait être suffisant).

BR
la source
7
HISTSIZEest le nombre de commandes à retenir, pas le nombre d'octets.
Chris Down
10

Je souffrais du même problème - mais mon .bashrcdossier avait déjà shopt -s histappendet correct HISTFILE, HISTSIZE, HISTFILESIZE.

Pour moi, le problème était que mon .bash_historyfichier appartenait à root plutôt qu'à mon nom d'utilisateur. Mon utilisateur ne pouvait donc jamais enregistrer ce fichier à la sortie.

icc97
la source
3
Je viens de découvrir que j'avais exactement le même problème avec .bash_history appartenant à root. J'aurais aimé réaliser avant d'avoir perdu toute ma belle histoire, mais tant pis :-)
SamStephens
idem ici - terminé plusieurs jours d'errance :) merci!
davka
1
sudo chmod your_user_name .bash_historyl'a fait! Merci.
wij
sudo chown user_name:user_name ~.bash_historyrésolu!
alper
3

Recherchez les variables d’environnement HISTFILE, HISTSIZE, HISTFILESIZE.

Jonathan Leffler
la source
2

J'ai écrit un script pour définir un fichier d'historique par session ou tâche, en fonction des éléments suivants.

    # write existing history to the old file
    history -a

    # set new historyfile
    export HISTFILE="$1"
    export HISET=$1

    # touch the new file to make sure it exists
    touch $HISTFILE
    # load new history file
    history -r $HISTFILE

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

simotek
la source
1

J'ai écrit quelques lignes dans mon .bashrc qui accomplissent les tâches suivantes: Enregistrez chaque session après chaque commande dans un fichier. Il y aura autant de fichiers d'historique que vous avez déjà démarré de terminaux. Lors du démarrage d'un nouveau terminal à partir du fichier d'historique le plus récent, chargez tous les fichiers d'historique des sessions précédentes dans le tampon d'historique jusqu'à ce qu'un seuil de nombre de lignes soit atteint.

HISTCONTROL=''
HISTFOLDER=~/.bash_histories
HISTFILEEXT=history      # only files in $HISTFOLDER with this extension will be read
shopt -s histappend   # append when closing session
mkdir -p $HISTFOLDER
HISTFILE=$HISTFOLDER/$(date +%Y-%m-%d_%H-%M-%S_%N).$HISTFILEEXT  # create unique file name for this session. Nanoseconds seems to be unique enough, try: for ((i=0; i<=10; i++)); do date +%Y-%m-%d_%H-%M-%S_%N; done
# if HISTFILE unset, history is not saved on exit -> not really necessary if we save after each command, but its a double net safety
HISTSIZE=-1       # maximum number of commands to hold inside bash history buffer
HISTFILESIZE=-1   # maximum number of lines in history file
# history -a $HISTFILE # bash saves the total history commands entered since startup or since the last save and saves that amount of commands to the file. This means reading a history file after typing commands will trip up bash, but this won't be a problem if the history file is only loaded in the beginning. This means that only new commands are saved not all the old loaded commands, thereby we can load as many history files into the buffer as we want and still only save newly thereafter typed commands
PROMPT_COMMAND="history -a $HISTFILE; $PROMPT_COMMAND"  # This command is executed after very typed command -> save history after each command instead after only closing the session

# Load old histories from last 5 files/sessions
HISTLINESTOLOAD=2000
# --reverse lists newest files at first
names=($(ls --reverse $HISTFOLDER/*.$HISTFILEEXT 2>/dev/null))
toload=()
linecount=0
# Check if is really file and count lines and only append to $toload if linecount under $HISTLINESTOLOAD
for fname in ${names[*]}; do
    if test -f $fname; then
        linecount=$((linecount+$(wc -l < $fname) ))
        if test $linecount -ge $HISTLINESTOLOAD; then
            break
        fi
        toload+=($fname)
    fi
done
# Beginning with the oldest load files in $toload into bash history buffer
for (( i=${#toload[*]}-1; i>=0; i-- )); do
    history -r ${toload[$i]}
done
mxmlnkn
la source
0

Je m'assurerais que .bash_history existe. Si ce n'est pas le cas, bash n'aura nulle part où enregistrer l'historique des commandes.

si .bash_history n'existe pas, créez-le en exécutant touch:

touch ~/.bash_history

cela crée simplement le fichier .bash_history vide dans votre répertoire personnel, qui se remplira de vos commandes et devrait persister entre les sessions.

Ray Shah
la source
0

Mon instance Amazon EC2 Ubuntu ne sauvegardait pas l'historique. .bashrcavait toutes les commandes requises comme mentionné dans d'autres réponses, mais la seule chose qui manquait était le fichier. Je devais le toucher pour le faire fonctionner.

touch ~/.bash_history
Chankey Pathak
la source
-1

Bonne réponse à cette question est ici:

http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html

DanJ
la source
3
Bienvenue sur SuperUser! Veuillez inclure suffisamment d'informations dans votre réponse pour que le demandeur ne soit pas obligé de cliquer sur un lien externe. De plus, assurez-vous que votre réponse ne fait pas que dupliquer les réponses existantes (ce qui semble bien se passer d'un coup d'œil à ce lien).
Indrek
//, on dirait un bon article. Mais je pense que stackexchange essaie d’être indépendant des destinations de liens, au moins un peu. Ça ne vous dérange pas d'ajouter une petite explication?
Nathan Basanese