Jak uniknąć powielania wpisów w .bash_history

108

To samo polecenie jest ciągle wymieniane w mojej historii. Jak mogę tego uniknąć? Wiem, że to możliwe, HISTCONTROLale nie znalazłem właściwej drogi.

karthick87
źródło
Utworzyłem powiązane pytanie: askubuntu.com/questions/205520/… . Dups w historii jest przydatny, aby zobaczyć kontekst polecenia. Czego chcesz czasem pominąć duplikaty podczas drukowania historii.
justingordon

Odpowiedzi:

123

Ze strony podręcznika bash:

HISTCONTROL

Rozdzielona dwukropkami lista wartości kontrolujących sposób zapisywania poleceń na liście historii. Jeśli lista wartości zawiera ignorespace, wiersze rozpoczynające się znakiem spacji nie są zapisywane na liście historii. Wartość ignoredupspowoduje, że wiersze pasujące do poprzedniego wpisu historii nie zostaną zapisane. Wartość ignorebothjest skrótem dla ignorespace i ignoredups. Wartośćerasedupspowoduje usunięcie wszystkich poprzednich wierszy pasujących do bieżącego wiersza z listy historii przed zapisaniem tego wiersza. Wszelkie wartości niewymienione na powyższej liście są ignorowane. Jeśli HISTCONTROL jest rozbrojony lub nie zawiera poprawnej wartości, wszystkie linie odczytywane przez analizator powłoki są zapisywane na liście historii, z zastrzeżeniem wartości HISTIGNORE. Drugi i kolejne wiersze polecenia złożonego z wielu wierszy nie są testowane i są dodawane do historii niezależnie od wartości HISTCONTROL.

Więc wstaw następujący wiersz w ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups

Izajasza
źródło
Czy chcesz, żebym dodał HISTCONTROL = ignoreboth na dole ~ / .bashrc?
karthick87
1
@karthick Nie ma znaczenia, gdzie to umieścisz, ale dno jest w porządku.
Izajasza
Podczas instalacji Ubuntu 12.04 musiałem dokonać tej modyfikacji. W ~/.bash_loginwiększości przypadków działałoby, gdyby zmodyfikowano plik .bashrc, ale nie zawsze tak jest.
ck-
3
Nie zapomnij uruchomić ich po aktualizacji swojego profilu bash / plików rc -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi
23

Umieść to w ~/.bashrc:

export HISTCONTROL=ignoredups

Zamiast tego możesz użyć ignoreboth. Jest to skrót zarówno dla ignorespaces(poleceń zaczynających się od spacji), jak i ignoredups(duplikatów).

Wolę ignoredupssam, ponieważ uważam, że domyślne zachowanie ignorowania poleceń ze spacjami z przodu jest dość denerwujące, gdy kopiuję polecenie ze strony internetowej i nie zostaje ono zapisane, ponieważ przypadkowo skopiowałem też w miejscu .... Ale każdy ich własny.

Oli
źródło
3
Nadal istnieją duplikaty .. Co może być problemem? imgur.com/fXeLQ.png
karthick87
5
@ karthick87 cytowany z innej odpowiedzi: Wartość ignoredupsprzyczyn wierszy pasujących do poprzedniego wpisu historii nie została zapisana . Usuwa tylko kolejne identyczne linie.
AL
10

Umieszczenie tego ~/.bashrcspowoduje zastosowanie rozwiązania @ alvin w różnych sesjach jako wlell

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

Źródło: Linux: Historia Bash: „ignorowane” i „wymazywane” powodują konflikt ze wspólną historią dla różnych sesji

Nour Wolf
źródło
Dlaczego jego export HISTCONTROLi wasze nie? Co za różnica? Działa dla mnie bez eksportu, jestem po prostu ciekawy
felwithe
1
Dobre pytanie! Chciałbym również poznać odpowiedź. Zasadniczo exportudostępnia zmienną podprocesom. stackoverflow.com/q/1158091/552621 W przypadku HISTCONTROL, PROMPT_COMMANDitd, zmienne te są wykorzystywane przez samego zbiornika, więc może ich eksportu (dzieci przetwarza) nie jest konieczne.
Nour Wolf,
4
export HISTCONTROL=erasedups
Bez dźwięku
źródło
3

Dodaj następujące elementy do ~/.bashrc:

export HISTCONTROL=ignoredups

Aby to zrobić, możesz użyć tego polecenia:

nano ~/.bashrc
jrg
źródło
0

Jednoznaczne nagrywanie każdego nowego polecenia jest trudne. Najpierw musisz dodać ~/.profilelub podobne:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Następnie musisz dodać do ~/.bash_logout:

history -a
history -w
Steven Penny
źródło