Come evitare voci duplicate in .bash_history


108

Lo stesso comando è elencato più volte nella mia cronologia. Come posso evitarlo? So che è possibile tramite HISTCONTROLma non ho trovato la strada giusta.


Ho creato una domanda correlata: askubuntu.com/questions/205520/… . Dups nella cronologia è utile per vedere il contesto di un comando. Cosa si desidera omettere i duplicati a volte quando si stampa la cronologia.
justingordon,

Risposte:


123

Dalla bashpagina man:

HISTCONTROL

Un elenco di valori separato da due punti che controlla il modo in cui i comandi vengono salvati nell'elenco della cronologia. Se l'elenco di valori include ignorespace, le righe che iniziano con un carattere spazio non vengono salvate nell'elenco cronologico. Un valore di ignoredupsfa sì che le righe corrispondenti alla voce della cronologia precedente non vengano salvate. Un valore di ignorebothè una scorciatoia per ignorespace e ignoredups. Un valore dierasedupsfa sì che tutte le righe precedenti corrispondenti alla riga corrente vengano rimosse dall'elenco cronologico prima che la riga venga salvata. Qualsiasi valore non presente nell'elenco precedente viene ignorato. Se HISTCONTROL non è impostato o non include un valore valido, tutte le righe lette dal parser della shell vengono salvate nell'elenco cronologico, soggetto al valore di HISTIGNORE. La seconda e le successive righe di un comando composto su più righe non vengono testate e vengono aggiunte alla cronologia indipendentemente dal valore di HISTCONTROL.

Quindi inserisci la seguente riga nel tuo ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups


Vuoi che aggiunga HISTCONTROL = ignoreboth nella parte inferiore di ~ / .bashrc?
karthick87,

1
@karthick Non importa dove lo metti, il fondo va bene però.
Isaia,

Sulla mia installazione di Ubuntu 12.04 ho dovuto fare questa modifica nella ~/.bash_loginmaggior parte del tempo che avrebbe funzionato se .bashrc è modificato, ma non è questo il caso tutto il tempo.
ck-

3
Non dimenticare di eseguirli dopo aver aggiornato il tuo profilo bash / file rc -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi

23

Attaccalo nel tuo ~/.bashrc:

export HISTCONTROL=ignoredups

Invece potresti usare ignoreboth. Questo è una scorciatoia per entrambi ignorespaces(comandi che iniziano con spazi) e ignoredups(duplicati).

Preferisco ignoredupsda solo perché trovo il comportamento predefinito di ignorare i comandi con spazi nella parte anteriore abbastanza fastidioso quando copio un comando da un sito Web e non viene salvato perché l'ho copiato accidentalmente anche in uno spazio .... Ma a ognuno il proprio.


3
Esistono ancora duplicati ... Qual è il problema ?? imgur.com/fXeLQ.png
karthick87

5
@ karthick87 citato da un'altra risposta: un valore di ignoredupscausa le righe che corrispondono alla voce della cronologia precedente non vengono salvate . Rimuove solo linee identiche consecutive.
AL

10

Inserendo questo ~/.bashrcsi applica la soluzione di @ alvin in diverse sessioni come wlell

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

Fonte: Linux: cronologia di Bash: "ignoredups" e "erasedups" creano conflitti con la cronologia comune tra le sessioni


Perché il suo uso export HISTCONTROLe il tuo no? Qual è la differenza? Funziona per me senza esportazione, sono solo curioso
prova il

1
Buona domanda! Vorrei anche sapere la risposta. In generale export, la variabile è disponibile per i sottoprocessi. stackoverflow.com/q/1158091/552621 Nel caso di HISTCONTROL, PROMPT_COMMANDecc., queste variabili vengono utilizzate dalla shell stessa, quindi forse non è necessario esportarle (nei processi secondari).
Nour Wolf,


3

Aggiungi quanto segue al tuo ~/.bashrc:

export HISTCONTROL=ignoredups

Per fare ciò, puoi usare questo comando:

nano ~/.bashrc

0

Registrare in modo univoco ogni nuovo comando è complicato. Per prima cosa devi aggiungere ~/.profileo simili:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Quindi devi aggiungere a ~/.bash_logout:

history -a
history -w
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.