Jak długo trwa zawartość pliku .bash_history?

11

Jak mogę zmodyfikować zawartość mojego bash_historypliku? Jakie wartości lub zmienne kontrolują, jak długo trwa historia? Czy są jakieś inne rzeczy, które mogę zmienić, aby zapewnić lepszą kontrolę nad moją historią BASH?

nbro
źródło
2
Nie sądzę, że ten plik jest kontrolowany przez czas, ale raczej przez ostateczny rozmiar pliku. Zobacz tutaj: Czy istnieje sposób, aby ustawić rozmiar listy historii w bash na ponad 5000 linii? . Więc środowisko. zmienne HISTSIZEi HISTFILESIZEsą jedynymi powierzchniami kontrolnymi, które musisz kontrolować, ile historii jest utrzymywane.
slm

Odpowiedzi:

12

Istnieją dwie zmienne, które kontrolują rozmiar historii:

HISTFILESIZE Maksymalna liczba wierszy zawartych w pliku historii. Gdy tej zmiennej zostanie przypisana wartość, plik historii jest w razie potrzeby obcinany, aby zawierał nie więcej niż tę liczbę wierszy, usuwając najstarsze wpisy. Plik historii jest również przycinany do tego rozmiaru po zapisaniu go po wyjściu powłoki. Jeśli wartość wynosi 0, plik historii jest obcinany do zera. Wartości nienumeryczne i wartości liczbowe mniejsze od zera hamują obcinanie. Powłoka ustawia wartość domyślną na wartość HISTSIZE po odczytaniu plików startowych.

i

HISTSIZE Liczba poleceń do zapamiętania w historii poleceń (patrz HISTORIA poniżej). Jeśli wartość wynosi 0, polecenia nie są zapisywane na liście historii. Wartości liczbowe mniejsze od zera powodują zapisanie każdego polecenia na liście historii (nie ma ograniczenia). Powłoka ustawia wartość domyślną na 500 po odczytaniu plików startowych.

Te dwie zmienne pozwalają kontrolować zachowanie historii. Zasadniczo HISTSIZEjest to liczba poleceń zapisanych podczas bieżącej sesji i HISTFILESIZEliczba poleceń, które zostaną zapamiętane między sesjami. Na przykład:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

W powyższym przykładzie, ponieważ HISTSIZEjest ustawiony na 10, historyzwraca listę 10 poleceń. Jeśli jednak wylogujesz się, a następnie zalogujesz ponownie, historyzwróci tylko 5 poleceń, ponieważ HISTFILESIZEjest ustawiony na 5. Jest tak, ponieważ po zakończeniu sesji HISTFILESIZEwiersze historii są zapisywane w pliku historii ( ~/.bash_historydomyślnie, ale kontrolowane przez HISTFILE). Innymi słowy, polecenia są dodawane, HISTFILEaż osiągnie $HISTFILESIZElinię, w którym to punkcie każda kolejna dodana linia oznacza, że ​​pierwsze polecenie pliku zostanie usunięte.

Możesz ustawić wartości tych zmiennych w swoim ~/.profile(lub ~/.bash_profilejeśli ten plik istnieje). Nie ustawiaj ich w ~/.bashrcpierwszej kolejności, ponieważ nie mają tam ustawionej działalności, a po drugie, ponieważ spowodowałoby to inne zachowanie się przy logowaniu niż w powłokach niezalogowanych, co może prowadzić do innych problemów .

Inne przydatne zmienne, które pozwalają precyzyjnie dostroić zachowanie twojej historii to:

  • HISTIGNORE: Pozwala to zignorować niektóre popularne polecenia, które rzadko są interesujące. Na przykład możesz ustawić:

    export HISTIGNORE="pwd:df:du"

    To spowodowałoby, że każde polecenie zaczynające się od pwd, dflub dubyłoby zignorowane i nie zapisane w twojej historii.

  • HISTCONTROL: Ten pozwala ci wybrać sposób działania historii. Osobiście ustawiłem to, HISTCONTROL=ignoredupsco powoduje, że zapisuje zduplikowane polecenia tylko raz. Inne opcje to ignorespacezignorowanie poleceń rozpoczynających się od białych znaków, erasedupsco powoduje usunięcie wszystkich poprzednich wierszy pasujących do bieżącego wiersza z listy historii przed zapisaniem tego wiersza. ignorebothjest skrótem dla ignorowania i ignorowania.

  • HISTTIMEFORMAT: Pozwala ustawić format czasu pliku historii. Zobacz odpowiedź Pandya lub przeczytaj, man bashaby uzyskać szczegółowe informacje.


W celu dalszego dostrojenia masz:

  • Opcja histappendbash. Można to ustawić, uruchamiając shopt -s histappendlub dodając to polecenie do swojego ~/.bashrc. Jeśli ta opcja jest ustawiona

    lista historii jest dołączana do pliku nazwanego wartością zmiennej HISTFILE po wyjściu powłoki, zamiast nadpisywania pliku.

    Jest to bardzo przydatne, ponieważ pozwala łączyć historie różnych sesji (na przykład różne terminale).

  • historyKomenda ma dwa użytecznych opcji:

    • history -a : powoduje automatyczne zapisanie ostatniego polecenia do pliku historii

    • history -r : importuje plik historii do bieżącej sesji.

    Możesz na przykład dodać te dwie komendy do swojej PROMPT_COMMAND(która jest wykonywana za każdym razem, gdy powłoka wyświetla monit, więc za każdym razem, gdy uruchamiasz nową powłokę i po każdej komendzie w niej uruchomionej):

    export PROMPT_COMMAND='history -a;history -r;'

    W połączeniu zapewniają one, że każdy otwarty terminal natychmiast zaimportuje historię innych sesji powłoki. Rezultatem jest wspólna historia dla wszystkich terminali / sesji powłoki.

terdon
źródło
2

Domyślny rozmiar pliku historii to 500 linii. Gdy plik .bash_history osiągnie 500 linii, wczesne wpisy zostają wyeliminowane, aby zrobić miejsce dla nowszych linii, jak w FIFO. Możesz to zmienić, zmieniając wartość zmiennej, HISTFILESIZEktóra domyślnie ma wartość 500.

Wpisanie a HISTFILESIZE=10000do twojego .bashrc zwiększy liczbę linii w pliku historii do 10000, tym samym wydłuży żywotność jego zawartości.

Światła miasta
źródło
2
Uwaga: jeśli HISTSIZEprzekroczysz limit, rozważ HISTFILEteż zmianę . Jeśli uruchomisz bash --norc HISTSIZE, wróci do wartości domyślnej, obcinając twoje HISTFILEprzy wyjściu.
llua
Dzięki, @llua. Podobnie, jeśli twój system /etc/bash.bashrcustawia HISTFILESIZE(a może HISTSIZE; nie sprawdziłem, który), wtedy Bash wydaje się obcinać .bash_historyw punkcie, który czyta /etc/bash.bashrc(lub przynajmniej w pewnym momencie, zanim nowy limit zostanie ustawiony we własnych plikach inicjujących Bash). Aby tego uniknąć, ponownie ustaw własną, HISTFILEtak aby twoja prawdziwa historia poszła tam, a nie do .bash_historypliku, który Bash obcina.
Chris Povirk
(Ale nie rób exporttego, ponieważ spowoduje to, że będzie to widoczne dla każdej skorupy .bash_history
potomnej
0

Przeczytaj man bashwięcej szczegółowych informacji na temat historii bash, takich jak:

HISTCONTROL
       Rozdzielona dwukropkami lista wartości kontrolujących sposób zapisywania poleceń na liście historii.
       Jeśli lista wartości zawiera ignorowanie, linie zaczynające się od znaku spacji to
       nie zapisane na liście historii. Wartość zignorowanych powoduje, że wiersze pasują do poprzedniego
       wpis historii nie ma być zapisywany. Wartość ignoreboth jest skrótem dla ignorowania i
       ignorowane. Wartość wymazanych powoduje, że wszystkie poprzednie wiersze pasują do bieżącego wiersza
       zostać usunięty z listy historii przed zapisaniem tego wiersza. Wszelkie wartości niewymienione powyżej
       lista jest ignorowana. Jeśli HISTCONTROL jest rozbrojony lub nie zawiera prawidłowej wartości, wszystkie linie
       odczytane przez parser powłoki są zapisywane na liście historii, z zastrzeżeniem wartości HISTIG-
       NORE. 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.
HISTFILE
       Nazwa pliku, w którym zapisana jest historia poleceń (patrz HISTORIA poniżej). Domyślny
       wartość wynosi ~ / .bash_history. Jeśli nie jest ustawiony, historia poleceń nie jest zapisywana po wyjściu powłoki.
HISTFILESIZE
       Maksymalna liczba wierszy zawartych w pliku historii. Gdy ta zmienna jest przypisana
       wartość, plik historii jest w razie potrzeby obcinany, aby zawierał nie więcej niż tę liczbę
       linii poprzez usunięcie najstarszych wpisów. Plik historii jest również obcinany do tego rozmiaru
       po napisaniu go po wyjściu powłoki. Jeśli wartość wynosi 0, plik historii jest obcinany do
       rozmiar zero. Wartości nienumeryczne i wartości liczbowe mniejsze od zera hamują obcinanie. The
       powłoka ustawia domyślną wartość na HISTSIZE po odczytaniu plików startowych.
HISTIGNORE
       Rozdzielona dwukropkami lista wzorców używanych do decydowania, w których liniach poleceń należy zapisać
       lista historii. Każdy wzór jest zakotwiczony na początku linii i musi być zgodny
       cały wiersz (nie jest dołączany żaden domyślny `* '). Każdy wzór jest testowany względem linii
       po zastosowaniu kontroli określonych przez HISTCONTROL. Oprócz normalnej powłoki
       wzorce dopasowujące znaki, `& 'odpowiada poprzedniej linii historii. „&” może zostać zastąpiony
       za pomocą odwrotnego ukośnika; ukośnik odwrotny jest usuwany przed próbą dopasowania. Drugi i
       kolejne wiersze polecenia złożonego z wielu wierszy nie są testowane i są dodawane do
       historia niezależnie od wartości HISTIGNORE.
HISTSIZE
       Liczba poleceń do zapamiętania w historii poleceń (patrz HISTORIA poniżej). Jeśli…
       wartość wynosi 0, polecenia nie są zapisywane na liście historii. Wartości liczbowe mniejsze niż zero
       skutkuje zapisaniem każdego polecenia na liście historii (nie ma limitu). Muszla
       ustawia wartość domyślną na 500 po odczytaniu plików startowych.
HISTTIMEFORMAT
       Jeśli ta zmienna jest ustawiona, a nie null, jej wartość jest używana jako ciąg formatu dla strftime (3)
       aby wydrukować znacznik czasu związany z każdym wpisem historii wyświetlanym przez historię
       wbudowany. Jeśli ta zmienna jest ustawiona, znaczniki czasu są zapisywane w pliku historii, więc mogą
       być zachowane podczas sesji powłoki. Wykorzystuje to znak komentarza historii do rozróżnienia
       zgasić znaczniki czasu z innych linii historii.

Szczególnie HISTFILESIZEi HISTSIZEmoże szukasz i pomaga.

Pandya
źródło