HISTSIZE to liczba wierszy lub poleceń przechowywanych w pamięci na liście historii podczas trwającej sesji bash.
HISTFILESIZE to liczba wierszy lub poleceń, które (a) są dozwolone w pliku historii podczas uruchamiania sesji i (b) są przechowywane w pliku historii na końcu sesji bash do wykorzystania w przyszłych sesjach.
Zwróć uwagę na różnicę między file: na dysku - a list: w pamięci.
Długa odpowiedź:
Wszystkie informacje powyżej + kilka przykładów:
Przykład 1 :
HISTFILESIZE=10iHISTSIZE=10
Rozpoczynasz sesję.
Twój HISTFILE (plik, który przechowuje historię poleceń bash) jest obcięty, aby zawierał HISTFILESIZE = 10 linii.
Piszesz 50 linijek.
Pod koniec twoich 50 poleceń na liście historii znajdują się tylko polecenia od 41 do 50, których rozmiar jest określony przez HISTSIZE = 10.
Kończysz sesję.
Zakładając, że histappendnie jest włączone, polecenia od 41 do 50 są zapisywane w pliku HISTFILE, który ma teraz 10 poleceń przechowywanych na początku plus 10 nowo napisanych poleceń.
Twój HISTFILE jest obcięty i zawiera HISTFILESIZE = 10 wierszy.
Masz teraz 10 poleceń w swojej historii - ostatnie 10, które właśnie wpisałeś w właśnie zakończonej sesji.
Rozpoczynając nową sesję, zaczynasz od 1 z HISTFILE o wartości HISTFILESIZE = 10.
Przykład 2 :
HISTFILESIZE=10iHISTSIZE=5
Rozpoczynasz sesję.
Twój HISTFILE (plik, który przechowuje historię poleceń bash) jest obcięty, aby zawierał co najwyżej HISTFILESIZE = 10 linii.
Piszesz 50 linijek.
Pod koniec twoich 50 poleceń, tylko polecenia 46 do 50 znajdują się na liście historii, których rozmiar jest określony przez HISTSIZE = 5.
Kończysz sesję.
Zakładając, że histappendnie jest włączone, polecenia od 46 do 50 są zapisywane w pliku HISTFILE, który ma teraz 10 poleceń przechowywanych na początku plus 5 nowo napisanych poleceń.
Twój HISTFILE jest obcięty i zawiera HISTFILESIZE = 10 wierszy.
Masz teraz w historii 10 poleceń - 5 z poprzedniej sesji i 5 ostatnich, które właśnie wpisałeś w właśnie zakończonej sesji.
Rozpoczynając nową sesję, zaczynasz od 1 z HISTFILE o wartości HISTFILESIZE = 10.
Przykład 3 :
HISTFILESIZE=5iHISTSIZE=10
Rozpoczynasz sesję.
Twój HISTFILE (plik, który przechowuje historię poleceń bash) jest obcięty, aby zawierał co najwyżej HISTFILESIZE = 5 linii.
Piszesz 50 linijek.
Pod koniec twoich 50 poleceń na liście historii znajdują się tylko polecenia od 41 do 50, których rozmiar jest określony przez HISTSIZE = 10.
Kończysz sesję.
Zakładając, że histappendnie jest włączone, polecenia od 41 do 50 są zapisywane w pliku HISTFILE, który ma teraz 5 poleceń przechowywanych na początku plus 10 nowo napisanych poleceń.
Twój HISTFILE został obcięty i zawierał HISTFILESIZE = 5 linii.
Masz teraz 5 poleceń w swojej historii - ostatnie 5, które właśnie wpisałeś w właśnie zakończonej sesji.
Rozpoczynając nową sesję, zaczynasz od kroku 1 z HISTFILE o wartości HISTFILESIZE = 5.
„Plik” historii nie jest aktualizowany podczas wpisywania poleceń. Polecenia są przechowywane na „liście” oddzielnie (dostęp do nich uzyskuje się za pomocą polecenia historii). Liczba tych przechowywanych poleceń jest kontrolowana przez wartość HISTSIZE. Kiedy powłoka (interaktywna) kończy pracę, ostatnie linie $ HISTSIZE są kopiowane / dołączane do $ HISTFILE z tej "listy". Jeśli ustawiono HISTFILESIZE, to po tej operacji zapewnia się, że w $ HISTFILE istnieją tylko linie $ HISTFILESIZE (najnowsze). Kiedy powłoka się uruchamia, "lista" jest inicjowana od $ HISTFILE do maksymalnie $ HISTSIZE poleceń.
A ze man bashstrony:
Wartość zmiennej HISTSIZE jest używana jako liczba poleceń do zapisania na liście historii. Zapisywany jest tekst ostatnich poleceń HISTSIZE (domyślnie 500). (...)
Podczas uruchamiania historia jest inicjowana z pliku o nazwie zmienna HISTFILE (domyślnie ~ / .bash_history). Plik nazwany wartością HISTFILE jest w razie potrzeby obcinany tak, aby zawierał nie więcej niż liczbę wierszy określoną przez wartość HISTFILESIZE. (...) Kiedy powłoka interaktywna kończy działanie, ostatnie linie $ HISTSIZE są kopiowane z listy historii do $ HISTFILE. Jeśli opcja powłoki histappend jest włączona (patrz opis shopt poniżej WBUDOWANE POLECENIA POWŁOKI), wiersze są dołączane do pliku historii, w przeciwnym razie plik historii jest nadpisywany. Jeśli HISTFILE nie jest ustawiony lub plik historii nie jest zapisywalny, historia nie jest zapisywana. (...) Po zapisaniu historii plik historii jest obcinany tak, aby zawierał nie więcej niż HISTFILESIZE wierszy. Jeśli HISTFILESIZE nie jest ustawione,
+1 Ta odpowiedź jest imponująco dokładna! Myślę jednak, że trochę za dużo. Większość ludzi nie dotrze do końca. Myślę, że powinieneś rozważyć podsumowanie tego
Slezica
22
@slezica Nie zgadzam się z drugą częścią twojego komentarza: dotarłem do końca i mogę powiedzieć, że każda informacja w odpowiedzi jest przydatna. Fakt, że niektórzy ludzie są zbyt leniwi, aby przeczytać kilka wierszy, nie powinien usprawiedliwiać usuwania przydatnych informacji dla innych.
Bastien
1
@Bastien zakładając, że jesteś parserem wypunktowania, nie będziesz miał trudności z przeczytaniem tego.
Pithikos,
6
Słuchaj, mój dysk twardy ma 1 TB i jest w dużej mierze pusty, i mam mnóstwo bezczynnych cykli procesora i pamięci RAM, i chcę zapisać jak najwięcej historii bash, więc kiedy muszę sprawdzić to głupie polecenie, nie mam '' za dwa lata, wiem, że to w mojej historii bash. Aby było bardziej konkretnie, powiedzmy, że do 50 MB historii bash. Jakie wartości polecacie?
CivFan
2
@Matthew przepraszam, nie wiem!
arturomp
6
Opierając się na tym, co powiedział Arturomp i starając się uczynić to nieco jaśniejszym.
Zakładając, że masz 2000-coś długą historię ...
~$ history
1 sdf
2 fghdfgjf
3 fghfghdf
....2027782028572029 yu45u
Możesz ograniczyć to, z czym jesteś pokazywany HISTSIZE
~$ HISTSIZE=5~$ history
20265462027782028562029 yu45u
2030 HISTSIZE=5
Teraz, bez względu na to, ile poleceń wpiszesz, tylko ostatnich 5 zostanie nagranych.
Widzimy wyraźnie, że nasze pierwsze polecenie („ABC”) nie występuje w historii, ponieważ zarejestrowano tylko 5 ostatnich poleceń.
Teraz cała historia jest przechowywana w pliku ( .bash_history) i możesz zmienić, jak długo ten plik będzie trwał z rozszerzeniem HISTFILESIZE. Na przykład z 2033HISTFILESIZE, w moim przypadku miałbym to:
~$ history
1 fghfghdf
2 gegege
3 gege
....2028 HISTSIZE=52029 GGH
2030 GSDHFG
2031 JFDR
2032 ABSDDS
2033 AHFGHFD
Jakie wartości można polecić, jeśli chcę całą historię ze wszystkich jednoczesnych terminali być zapisywane w historii bash, na zawsze ? Innymi słowy, zawsze zapisuj wszystko i nigdy niczego nie usuwaj.
CivFan
10
@CivFan: Ustaw HISTSIZE=-1i HISTFILESIZE=-1.
M. Dudley,
2
To jest bardzo złe. Ustawienie wartości -1 wyczyści wszystko.
Brendan Byrd,
3
@BrendanByrd Strona podręcznika bashmówi: Non-numeric values and numeric values less than zero inhibit truncationale wtedy nie miałem odwagi sprawdzić, czy to prawda, ponieważ nie chcę stracić swojej historii :-)
SebMa
3
@SebMa Zmieniłem moje ustawienia na HISTSIZE='INFINITY'i HISTFILESIZE='ANDBEYOND'. Ponieważ nie są numeryczne, zapisują wszystko. Dzięki za wskazówkę!
Opierając się na tym, co powiedział Arturomp i starając się uczynić to nieco jaśniejszym.
Zakładając, że masz 2000-coś długą historię ...
Możesz ograniczyć to, z czym jesteś pokazywany
HISTSIZE
Teraz, bez względu na to, ile poleceń wpiszesz, tylko ostatnich 5 zostanie nagranych.
Widzimy wyraźnie, że nasze pierwsze polecenie („ABC”) nie występuje w historii, ponieważ zarejestrowano tylko 5 ostatnich poleceń.
Teraz cała historia jest przechowywana w pliku (
.bash_history
) i możesz zmienić, jak długo ten plik będzie trwał z rozszerzeniemHISTFILESIZE
. Na przykład z2033
HISTFILESIZE
, w moim przypadku miałbym to:źródło
HISTSIZE=-1
iHISTFILESIZE=-1
.bash
mówi:Non-numeric values and numeric values less than zero inhibit truncation
ale wtedy nie miałem odwagi sprawdzić, czy to prawda, ponieważ nie chcę stracić swojej historii :-)HISTSIZE='INFINITY'
iHISTFILESIZE='ANDBEYOND'
. Ponieważ nie są numeryczne, zapisują wszystko. Dzięki za wskazówkę!