Czy istnieje sposób na zdefiniowanie nieograniczonej historii w Bash?
83
Dodaj to do .bashrc
(Linux) lub .bash_profile
(MacOS):
export HISTFILESIZE=
export HISTSIZE=
Proszę bardzo, nieograniczona historia. Obecnie mam 27000 wpisów :)
Od man bash
:
Jeśli
HISTFILESIZE
nie jest ustawiony, nie jest wykonywane obcinanie.
Oznacza to, że .bash_history
nigdy nie jest obcinany
To samo wydaje się dotyczyć HISTSIZE
, chociaż nie mogłem znaleźć tego udokumentowanego.
Kolejną ciekawą funkcją, którą zamierzam wypróbować, jest:
Jeśli
HISTTIMEFORMAT
zmienna jest ustawiona, znaczniki czasu są zapisywane w pliku historii, oznaczone znakiem komentarza historii, dzięki czemu można je zachować w sesjach powłoki, jak poniżej:
export HISTTIMEFORMAT="%F %T "
Daj mi znać, jeśli już tego próbowałeś ...
gdb
; jeśli ustawiszHISTSIZE
zmienną, przyjmie ona wartość 0, tym samym całkowicie wyłączając rozmiar historii.export
,HISTFILESIZE
jest w liczbie wierszy (nie bajtów), a obcinanie pliku historii następuje po ustawieniu zmiennejHISTFILESIZE
(i po wyjściu powłoki). Więc nie ustawiaj go dwukrotnie w pliku konfiguracyjnym o różnych wartościach(ponowne opublikowanie mojej odpowiedzi z https://stackoverflow.com/a/19533853/128597 )
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
screen
sesji) nadal będą obcinać Twoją historię:Po drugie, dodaj to na dole swojego .bashrc:
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 usunąć je 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.
źródło
HISTFILESIZE
, dlatego powinieneś usunąć każde zdarzenie takiego zdarzenia oprócz tego, którego chcesz. Zostanie również obcięty przy wyjściu z powłoki (ale jest to oczekiwane). I nie powinieneś potrzebowaćexport
.bash --norc
spowoduje ponowne obcięcie historii.export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"
do oddzielania historii powłoki osobno dla każdej sesji (na podstawie nazwy hosta i nazwy tty). Oczywiście najpierw muszę utworzyć katalog ~ / hist.PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Uwzględnij w ~ / .bashrc :
Ta odpowiedź spełnia następujące kryteria:
osobna historia główna (żadna sesja nie może przerwać twojej historii)
automatyczne zapisywanie historii (bez skrótów klawiszowych)
rzadkie zapisy (brak dołączania po każdym poleceniu)
tło
Przy uruchamianiu interaktywnym, jeśli
$HISTFILESIZE
jest ustawiony na liczbę, bash obcina$HISTFILE
ten numer. Po zamknięciu interaktywnym, jeślihistappend
ustawiona jest opcja powłoki , bash dodaje$HISTSIZE
linie do$HISTFILE
, w przeciwnym razie nadpisuje$HISTFILE
.wskazówki dla OSX (Terminal)
Za każdym razem, gdy tworzona jest karta w Terminalu,
~/.bash_profile
jest czytana, co oznacza, że bash nie czyta dalej~/.bashrc
. Dodaj następujący wiersz do~/etc/bash_profile
:wskazówki dotyczące ekranu
Jeśli używasz screena, twój plik konfiguracyjny to ~ / .screenrc. Jeśli chcesz, aby ekran zapisywał historię, wystarczy ustawić go tak, aby używał powłoki logowania, która będzie pobierała pliki startowe bash (i zapisywała Twoją historię).
źródło
Inna koncepcja (może nie mieć zastosowania), ale możesz mieć
unlimited
historię, gdy używasz sink-shell .źródło