Unlimited Bash History [zamknięta]

350

Chcę, aby mój .bash_historyplik był nieograniczony. np. Więc zawsze mogę wrócić i zobaczyć, jak coś zbudowałem / skonfigurowałem, czym było to fajne polecenie lub jak jakieś polecenie złamało się kilka tygodni temu. Jak mogę zmienić to ustawienie?

Francis Haart
źródło
1
Bash jest językiem programowania i nie chodzi o programowanie?
NeilG

Odpowiedzi:

307

Ustaw HISTSIZEi HISTFILESIZEw .bashrc na pusty ciąg:

HISTSIZE= 
HISTFILESIZE=

W wersji bash 4.3 i nowszych możesz także użyć HISTSIZE=-1 HISTFILESIZE=-1:

n.  Setting HISTSIZE to a value less than zero causes the history list to be
    unlimited (setting it 0 zero disables the history list).

o.  Setting HISTFILESIZE to a value less than zero causes the history file size
    to be unlimited (setting it to 0 causes the history file to be truncated
    to zero size).
Lri
źródło
12
(export PROMPT_COMMAND = 'history -a') może natychmiast opróżnić polecenia, aby skasować historię.
cruelcage
3
Ustawienie HISTSIZE= HISTFILESIZE=powoduje całkowite wyłączenie historii bash, przynajmniej dla mnie.
Philipp Ludwig
5
Ustawienie @ PhilippLudwig HISTSIZE=-1 HISTFILESIZE=-1wyłączyło moją historię, podczas gdy załatwiło sprawę HISTSIZE= HISTFILESIZE=. CentOS 7 tutaj.
Seether
1
@PhilippLudwig Myślę, że raczej niż HISTSIZE= HISTFILESIZE=powinieneśexport HISTSIZE= export HISTFILESIZE=
Matzz
3
@Seether Odpowiedź jasno stwierdza: „W wersji bash 4.3 i nowszych ...”. CentOS 7 ma bash 4.2.x.
villapx
426

Po wielu dużych, brzydkich iteracjach i dziwnych przypadkach na przestrzeni lat, teraz mam zwięzłą sekcję mojego .bashrc poświęconą temu.

Najpierw musisz skomentować lub usunąć tę sekcję .bashrc (domyślnie dla Ubuntu). Jeśli tego nie zrobisz, niektóre środowiska (takie jak uruchamianie screensesji) nadal będą obcinać Twoją historię:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

Po drugie, dodaj to na dole swojego .bashrc:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# http://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Uwaga: każde polecenie jest zapisywane natychmiast po uruchomieniu, więc jeśli przypadkowo wkleisz hasło, nie możesz po prostu „zabić -9 %%”, aby uniknąć zapisu historii, musisz je usunąć ręcznie.

Pamiętaj również, że każda sesja bash załaduje pełny plik historii do pamięci, ale nawet jeśli Twój plik historii powiększy się do 10 MB (co zajmie dużo czasu), nie zauważysz dużego wpływu na czas uruchamiania basha.

fotinakis
źródło
1
@AquariusPower - wypróbuj dokładnie to, co powyżej, ustaw HISTFILESIZE=i HISTSIZE=puste zamiast -1 i upewnij się, że nie masz innych deklaracji tych parametrów w .bashrc lub .bash_profile lub .profile.
fotinakis
2
winowajca .bashrc, miałem tę konfigurację później na innym pliku załadowanym przez .bashrc ..., teraz działa! dzięki!
Aquarius Power
10
Dodaj go do mojego standardowego systemu bash, a dodanie bieżącej historii jest również miłe, więc po konfiguracji uruchomcat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meillaud
2
Aby zachować historię, zainicjuj plik historii z bieżącą historią.
Arthur
3
Wielkie dzięki - nie można przecenić faktu, że ustawienie HISTFILESIZE(i ewentualnie HISTSIZE) przyniesie natychmiastowy skutek .
Attie
37

Jak wspomniano powyżej Jörg Beyer HISTSIZEi HISTFILESIZEsą kluczowe.

Ponadto zdecydowanie powinieneś sprawdzić zmienną środowiskową HISTCONTROL, która pozwala robić fajne rzeczy, takie jak nie przechowywać zduplikowanych poleceń historii ( HISTCONTROL=erasedups). Nie ma sensu mieć nieograniczonej historii, jeśli musisz przeglądać setki linii cd ..lub tym podobnych.

Linki: tutaj i praca z historią bash . Warto również przejrzeć często zadawane pytania dotyczące zmiennych bash .

simont
źródło
13
Te wiersze cd dają kontekst dla wydanych poleceń. Są naprawdę niezwykle przydatne. Nie rozumiem, dlaczego ktokolwiek chciałby je usunąć, chyba że jedynym sposobem, w jaki korzystasz z historii, jest przeglądanie jej po jednym poleceniu na raz.
iconoclast
@simont Używam również opcji ignorowania z HISTCONTROL, a następnie używam tego do wszystkiego, czego nie chcę zapisywać w historii, np. do haseł.
bigtunacan
6
Utrzymywanie wierszy w porządku jest bardzo przydatne, jeśli ponownie użyjesz sekwencji poleceń. Np . Ctrl-rNiektóre Ctrl-o Ctrl-o Ctrl-o Ctrl-o. Dlatego przechowuję duplikaty w historii.
Stéphane Gourichon
1
@ StéphaneGourichon po co Ctrl-o?
Ciprian Tomoiagă
4
@ CiprianTomoiagă Ctrl-ouruchamia polecenie w wierszu polecenia i natychmiast wyświetla polecenie zaraz po poprzednim w historii. Jedną z korzyści jest to, że po użyciu Ctrl-rdo znalezienia starego polecenia (być może za pomocą strzałki w górę i w dół, aby przejść do sąsiednich poleceń w historii), wystarczy przytrzymać Ctrlnaciśnięty i nacisnąć okilkakrotnie, aby ponownie uruchomić poprzednią serię poleceń, nawet w nieskończonej pętli Jeśli chcesz. Zobacz także GNU Readline - Wikipedia
Stéphane Gourichon
22

Istnieją (przynajmniej) dwa odpowiednie zmienne środowiskowe:

  • HISTSIZE: liczba wpisów w pliku historii
  • HISTFILESIZE: liczba wierszy w pliku historii

Myślę, że możemy się zgodzić, że termin nieograniczony jest często taki sam, jak bardzo duży (czy masz nieograniczoną ilość miejsca na pliki?). Więc po prostu ustaw wartości bardzo duże.

Jörg Beyer
źródło
23
„Należy zauważyć, że 1000000000 jest równa nieskończoności tylko dla bardzo małych wartości nieskończoności. - sepp2k” lol. tak, jestem zadowolony z małych wartości nieskończoności (powiedzmy, miesiąc częstego używania terminala).
Francis Haart
6
miesiąc częstego używania końcowego to nieskończenie mała frakcja nieskończoności. Powiedziałbym, że okres częstego używania terminali odpowiada bardzo, bardzo, bardzo małej wartości nieskończoności. Ale okres częstego używania terminala jest wystarczający dla mojej historii powłoki. ;)
iconoclast
2
Przynajmniej starsze wersje zsh ulegną awarii, jeśli ustawisz HISTSIZE i / lub HISTFILESIZE za duży, ponieważ próbuje on wstępnie przydzielić wystarczającą ilość pamięci. Stało się to istotne podczas uruchamiania narzędzi, które używają zsh jako powłoki (na przykład dbx).
Brian Vandenberg