czasami polecenia historii nie są przechowywane w .bash_history

20

Wczoraj wydałem wiele poleceń w moim CentOS 7. Ale kiedy chciałem dzisiaj odzyskać te polecenia, stwierdziłem, że nie było żadnego rekordu. Kiedy otworzyłem plik .bash_history, nadal nie mogłem znaleźć poleceń, które wydałem wczoraj, ale wiele starych poleceń znalazłem kilka dni temu. Dlaczego ostatnie polecenia nie zostały zapisane? Jak mogę zwiększyć możliwości historii?

Jacek
źródło
Czasami, gdy terminal jest nienormalnie zamknięty, historia nie jest zapisywana, zdarzyło mi się to również, ale nie znam okoliczności, które powodują to zachowanie
labirynty

Odpowiedzi:

11

Najbardziej prawdopodobną przyczyną, aby elementy historii nie były wyświetlane, nie jest ustawienie HISTFILEna HISTSIZEzero lub na zero, jest to poprzez dwukrotne zalogowanie się na tę samą maszynę i wyjście z drugiej instancji bash (w której zrobiłeś niewiele lub nic) po tej, w której dużo zrobiłeś. Domyślnie Bash nie łączy historii, a drugie wyjście Bash zastępuje to, .bash_historyco było tak ładnie zaktualizowane przez pierwsze wyjście Bash.

Aby temu zapobiec, możesz dołączyć do pliku historii zamiast nadpisywania, możesz użyć histappendopcji powłoki:

Jeśli włączona jest opcja powłoki histappend (patrz opis shopt w POLECENIA WBUDOWANE POWŁOKI poniżej), wiersze są dołączane do pliku historii, w przeciwnym razie plik historii zostanie nadpisany.

Więcej szczegółów w tej odpowiedzi tym, jak używać HISTSIZE, HISTFILESIZEi HISTCONTROLkontrolować wielkość, itp duplikaty

Anthon
źródło
3

Aby zmodyfikować historii korzystają z filtrów dwie zmienne BASH HISTSIZE, HISTFILESIZE(zazwyczaj określone w .bashrc).

Opis ze strony podręcznika BASH:

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). Po odczytaniu plików startowych powłoka ustawia wartość domyślną na 500.

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.

Jako przykład mam następujące ustawienia w moim .bashrcpliku:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
kubek kawy
źródło
1

Tak się stało, ale rozwiązania nie wymieniono tutaj. Przyczyną był po prostu problem z kopiowaniem i wklejaniem. Kopiowałem polecenie z innego dokumentu i miałem trochę białego miejsca w schowku. Z jakiegoś powodu spowodowało to, że Ubuntu nie zapisało polecenia w pliku historii.

wprowadź opis zdjęcia tutaj

Powyższe zdjęcie było poleceniem, które miałem w moim schowku z dokumentów Google. To polecenie działało, ale zostało pominięte w mojej historii. Właśnie wróciłem i wybrałem polecenie bez białych znaków, a potem pojawiło się ono w historii bash.

Tycon
źródło
5
Jedną z opcji historii jest ignorowanie (nie zapisywanie) wierszy rozpoczynających się spacją. Zwykle jest domyślnie włączone. Można to zmienić w swoim .bashrc.
studog
1

Sprawdź, czy HISTCONTROLzmienna środowiskowa nie jest ustawiona na ignorespacelub ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Możesz go zmodyfikować, ustawiając wartość w swoim ~/.bash_profilelub swoim ~/.profilepliku:

HISTCONTROL=ignoredups

Ze bashstrony podręcznika:

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 ignorespacei 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 nieustawione lub nie zawiera poprawnej wartości, wszystkie wiersze odczytane 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.

Gawi
źródło