Aby zrozumieć zachowanie historii bash, najpierw musisz wiedzieć:
- W pliku historii znajduje się historia.
- W pamięci procesu bash znajduje się historia.
- Historia w pamięci jednego procesu bash nie jest zsynchronizowana z historią w pamięci innego procesu bash.
- Historia w pamięci procesu bash nie jest zsynchronizowana z historią w pliku, chyba że zostanie wyraźnie poproszony o określone zdarzenie lub podczas niego (patrz poniżej).
Przy użyciu ustawień domyślnych cykl życia sesji bash w odniesieniu do historii wygląda następująco:
- Podczas uruchamiania bash odczyta plik historii. Zawartość pliku historii znajduje się teraz w pamięci procesu bash.
- Podczas normalnego użytkowania manipulowana jest tylko historia w pamięci.
- Podczas zamykania historia w pamięci jest zapisywana do pliku historii, zastępując wcześniejszą zawartość pliku historii.
Pozornie niedeterministyczne zachowanie, które zaobserwowałeś, jest głównie spowodowane tym, że zawartość pliku historii jest zawsze historią ostatniej zamkniętej sesji bash, a bash czyta plik historii tylko podczas uruchamiania.
Przeczytaj instrukcję bash, aby uzyskać bardziej szczegółowe wyjaśnienie procesu uruchamiania i zamykania.
Zauważ, że przy ustawieniach domyślnych mam na myśli ustawienia domyślne z bash. Twoja dystrybucja mogła dostarczyć .bashrc
(lub /etc/bash.bashrc
), które zmieniają to zachowanie.
Włączając opcję powłoki histappend
, możesz nakazać bashowi dołączenie zamiast zastępowania pliku historii. Możesz włączyć histappend
za pomocą polecenia shopt -s histappend
. Aby ta opcja była zawsze włączona, musisz umieścić polecenie w swoim .bashrc
(lub innym pliku inicjującym). Przeczytaj więcej o shopt
poleceniu w podręczniku bash
Zauważ, że włączenie histappend
nie zmniejszy znacznie pozornie niedeterministycznego zachowania. Dzieje się tak, ponieważ każda sesja bash wciąż ma swoją własną historię w pamięci. Możliwe jest posiadanie głównie zsynchronizowanej historii bash. Istnieje przewodnik, jak sprawić, by każdy proces bash miał zsynchronizowaną historię w wątku dotyczącym przepełnienia stosu .
za pomocą wbudowanego polecenia history
możesz jawnie nakazać bashowi odczytanie historii z pliku do pamięci lub zapisanie z pamięci do pliku. Na przykład: history -r
odczytuje zawartość pliku i dołącza go do historii w pamięci. history -w
zapisze bieżącą historię z pamięci do pliku, zastępując poprzednią zawartość. Zasadniczo dzieje się to podczas wyłączania. Przeczytaj więcej o history
poleceniu w podręczniku bash
Dla kompletności oto lista wewnętrznych zmiennych, które modyfikują zachowanie historii:
HISTFILE
: plik do odczytu i zapisu historii.
HISTFILESIZE
: maksymalna liczba wierszy dla pliku historii.
HISTSIZE
: maksymalna liczba wierszy dla historii w pamięci.
HISTCONTROL
, HISTIGNORE
, HISTTIMEFORMAT
: Nie odnosi się do tej dyskusji. Przeczytać instrukcję bash szczegóły.
.bashrc
pliku. zwróć uwagę, że Twoja dystrybucja mogła zmienić niektóre ustawienia w/etc/bash.bashrc
. sprawdź specjalnie dla opcji powłokihistappend
.http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactactive
Możesz manipulować sposobem zapisywania pliku historii za pomocą jednego z terminali, tj. Wykonać „history -a” lub „history -w” w terminalu, w którym chcesz zapisać historię, a następnie „history -r” w pozostałe terminale. Zależy od tego, co chcesz zrobić.
źródło
AFAIK, polecenia bash są zapisywane po zakończeniu sesji SSH. Tak więc polecenia nie są zapisywane, gdy sesja kończy się nienormalnie (na przykład z powodu awarii sieci). Mówię tutaj o sesjach SSH. Lokalne terminale mogą stosować podobne podejście.
Podczas otwierania wielu sesji w tym samym czasie polecenia wpisane w jednej sesji nie są widoczne w drugiej, gdy obie są aktywne. Jednak po zakończeniu sesji zobaczysz te polecenia, ponownie je otwórz.
źródło