L'enregistrement de l'historique de bash à partir de plusieurs Konsole ne fonctionne pas correctement

9

J'utilise plusieurs terminaux Konsole. Et je veux que toutes les commandes que je tape dans chaque terminal soient enregistrées dans l'historique des commandes, de sorte que la prochaine konsole que j'ouvrirai aura toutes. Pour empêcher chaque terminal d'écraser l'historique des commandes de l'autre terminal, j'ai donné les paramètres suivants dans mon.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

J'ai donné la dernière ligne pour voir le numéro de commande dans mon invite. La commande no. n'a jamais dépassé 600, mais certaines de mes anciennes commandes disparaissent encore de l'histoire. Il existe de nombreuses commandes qui sont données à plusieurs reprises, mais comme prévu ignoredups, cela n'augmente jamais la commande no in prompt. Pourtant, les anciennes commandes disparaissent toujours et le nombre de commandes dans l'histoire reste toujours légèrement supérieur à 500.

Le .bash_historyfichier contient encore beaucoup de doublons malgré les ignorés.

PS: Les sorties d'écho $HISTSIZEet $HISTFILESIZEsont à la fois=1000


Mise à jour: J'ai trouvé le problème dans l'entrée ci-dessus pour .bashrc. Il suffit d' appeler history -aà PROMPT_COMMANDconcatène simplement la dernière nouvelle commande au .bash_history. Donc, ignoredupset erasedupsn'ont aucun effet.

Existe-t-il un moyen, je peux toujours écrire dans le .bash_history sans doublons de chaque terminal? Je ne veux pas charger tout l'historique à chaque invite de commande history -ret le réécrire history -w, car les commandes que j'ai émises dans un terminal apparaîtront également dans un autre terminal parallèle. Je veux que les commandes combinées n'apparaissent que dans un nouveau terminal.

Le casse-tête, pourquoi mon histoire était réduite à 500, est résolu. J'ai remarqué que cela arrivait chaque fois que je ssh dans cette machine. La création d'un .bash_profileavec l'entrée suivante a résolu ce problème.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

Maintenant, mon .bashrc est exécuté à chaque fois que je ssh aussi. Et la taille du fichier historique augmente désormais de façon monotone.

indiajoe
la source
C'est ce que tu cherches? unix.stackexchange.com/questions/1288/…
jasonwryan
Non. Je veux éviter la deuxième exigence de la liste d'Oli. Je ne veux pas que l'histoire de mon terminal soit mélangée. Jusqu'à ce que je démarre un nouveau terminal. C'est ce qui se produit naturellement lorsque j'arrête correctement ma machine. Mais parfois, un arrêt correct n'est pas possible et à moins que je ne sauvegarde l'historique instantanément, tout sera perdu en une coupure de courant soudaine.
indiajoe
Cela ressemble à peu près à la question qui apparaît sur la bug-bashliste de diffusion un an après la publication de cette question: lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
syntaxerror

Réponses:

1

J'ai conclu qu'il n'est pas possible d'ajouter les nouvelles commandes directement et en même temps pour supprimer les doublons. Ma solution consiste donc à exécuter les commandes suivantes de temps en temps. ou pour le mettre dans ma crontab.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

La commande ci-dessus conservera la dernière occurrence d'une commande et supprimera toutes les autres répétitions au-dessus d'elle du fichier historique sans gâcher l'ordre.

indiajoe
la source
0

Il est laid, et je suis sûr que sedou awkserait mieux, mais j'ai essayé de résoudre le même problème en ajoutant dans mon .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

Cela créera un fichier d'historique séparé pour chaque terminal que vous ouvrez, cependant si vous exécutez bash dans bash, il utilisera le même historique, mais ne devrait pas écraser. Je vais vous avertir avec une mise en garde de mon expérience. Bien que cela fonctionne et empêche l'historique d'être écrasé, vous devez grepplusieurs fichiers pour essayer de trouver l'historique que vous recherchez, ce qui peut parfois prendre du temps.

umeboshi
la source