bash HISTSIZE a HISTFILESIZE?


174

Jaka jest różnica w HISTSIZEvs. HISTFILESIZE?

Są używane do rozszerzenia historii basha poza domyślne 500 linii.

Wydaje się, że tutaj i na innych forach brakuje jasności co do tego, dlaczego oba są potrzebne. ( Przykład 1 , przykład 2 , przykład 3 ).

Odpowiedzi:


289

Krótka odpowiedź:

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

  1. Rozpoczynasz sesję.
  2. Twój HISTFILE (plik, który przechowuje historię poleceń bash) jest obcięty, aby zawierał HISTFILESIZE = 10 linii.
  3. Piszesz 50 linijek.
  4. 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.
  5. Kończysz sesję.
  6. 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ń.
  7. Twój HISTFILE jest obcięty i zawiera HISTFILESIZE = 10 wierszy.
  8. Masz teraz 10 poleceń w swojej historii - ostatnie 10, które właśnie wpisałeś w właśnie zakończonej sesji.
  9. Rozpoczynając nową sesję, zaczynasz od 1 z HISTFILE o wartości HISTFILESIZE = 10.

Przykład 2 : HISTFILESIZE=10iHISTSIZE=5

  1. Rozpoczynasz sesję.
  2. Twój HISTFILE (plik, który przechowuje historię poleceń bash) jest obcięty, aby zawierał co najwyżej HISTFILESIZE = 10 linii.
  3. Piszesz 50 linijek.
  4. 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.
  5. Kończysz sesję.
  6. 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ń.
  7. Twój HISTFILE jest obcięty i zawiera HISTFILESIZE = 10 wierszy.
  8. 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.
  9. Rozpoczynając nową sesję, zaczynasz od 1 z HISTFILE o wartości HISTFILESIZE = 10.

Przykład 3 : HISTFILESIZE=5iHISTSIZE=10

  1. Rozpoczynasz sesję.
  2. Twój HISTFILE (plik, który przechowuje historię poleceń bash) jest obcięty, aby zawierał co najwyżej HISTFILESIZE = 5 linii.
  3. Piszesz 50 linijek.
  4. 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.
  5. Kończysz sesję.
  6. 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ń.
  7. Twój HISTFILE został obcięty i zawierał HISTFILESIZE = 5 linii.
  8. Masz teraz 5 poleceń w swojej historii - ostatnie 5, które właśnie wpisałeś w właśnie zakończonej sesji.
  9. Rozpoczynając nową sesję, zaczynasz od kroku 1 z HISTFILE o wartości HISTFILESIZE = 5.

Informacje z elixir_sinari :

„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,


27
+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
   ..  ..
 2027  78
 2028  57
 2029  yu45u

Możesz ograniczyć to, z czym jesteś pokazywany HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

Teraz, bez względu na to, ile poleceń wpiszesz, tylko ostatnich 5 zostanie nagranych.

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

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 2033 HISTFILESIZE, w moim przypadku miałbym to:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD

3
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ę!
Connor,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.