Gdzie przechowywana jest historia bash?

95

Po uruchomieniu historymogę zobaczyć moje ostatnio wykonane polecenia.

Ale jeśli to zrobię tail -f $HISTFILElub tail -f ~/.bash_historynie zostaną wymienione.

Czy plik jest zablokowany, czy istnieje tymczasowa lokalizacja lub coś podobnego?

Adionditsak
źródło

Odpowiedzi:

117

Bash utrzymuje listę poleceń wewnętrznie w pamięci podczas działania. Są zapisywane .bash_historyprzy wyjściu :

Po wyjściu powłoki interaktywnej ostatnie wiersze $ HISTSIZE są kopiowane z listy historii do pliku o nazwie $ HISTFILE

Jeśli chcesz wymusić zapisanie historii poleceń, możesz użyć history -apolecenia, które:

Dołącz nowe linie historii (linie historii wprowadzone od początku bieżącej sesji Bash) do pliku historii.

Istnieje również -wopcja:

Zapisz bieżącą historię do pliku historii.

co może ci bardziej odpowiadać w zależności od tego, jak korzystasz z historii.

Jeśli chcesz mieć pewność, że zawsze są one zapisywane natychmiast, możesz umieścić to polecenie w PROMPT_COMMANDzmiennej:

export PROMPT_COMMAND='history -a'
Michael Homer
źródło
Uwaga dodatkowa: jeśli .bash_historyplik przypadkowo stanie się własnością root, rzeczy przestaną działać. W takim przypadku sprawdź własność i użyj, sudoaby naprawić własność w razie potrzeby.
trek
13

(Brak odpowiedzi, ale nie mogę dodawać komentarzy)

Jeśli sprawdzasz, .bash_historyponieważ chcesz po prostu usunąć określone polecenie (np. Zawierające wyraźne hasło), możesz bezpośrednio usunąć wpis w pamięci za pomocą history -d <entry_id>.

Załóżmy na przykład, że dane wyjściowe:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

i chcesz oczyścić exportlinię, możesz to po prostu osiągnąć poprzez:

history -d 928
Eddie C.
źródło
11

bash zachowuje go w pamięci roboczej, bash można skonfigurować tak, aby zapisywał go po zamknięciu bash lub po każdym poleceniu, i by był ładowany po uruchomieniu bash lub na żądanie.

Jeśli skonfigurujesz zapisywanie po każdym poleceniu, zastanów się nad konsekwencjami uruchamiania wielu bashów jednocześnie. (wiersze poleceń będą przeplatane)

ctrl-alt-delor
źródło
2
Początek Twojej odpowiedzi sprawia, że ​​brzmi to tak, jakby historia była przechowywana w pliku o nazwie bash, a nawet w bashpliku wykonywalnym. Napisałbym: „Jest przechowywany bashw pamięci ...”
Anthon
to jest rzeczywiście lepsze
Anthon
5

Polecenia są zapisywane w pamięci (RAM), gdy sesja jest aktywna. Jak tylko zamkniesz powłokę, lista poleceń zostanie zapisana .bash_historyprzed zamknięciem.

Dlatego nie zobaczysz historii bieżącej sesji w .bash_history.

JaySo
źródło
4
Plik historii jest aktualizowany po bashzakończeniu, co nie oznacza ponownego uruchomienia komputera (szczególnie w środowisku graficznym, w którym można otwierać i zamykać terminale według własnego uznania).
John WH Smith
4

Podczas działania historia jest przechowywana tylko w pamięci (domyślnie), jeżeli:

  • set -o historia ( Hin in echo "$-") jest ustawiona.
  • HISTSIZE nie jest 0 i
  • HISTIGNORE nie jest *(lub jakimś innym bardzo restrykcyjnym wzorem).

Jeśli którakolwiek z powyższych sytuacji zawiedzie, żadna historia nie jest zapisywana w pamięci, w wyniku czego historia nie może lub nie zostanie zapisana na dysku.

Historia w pamięci jest zapisywana na dysk, jeśli:

  • HISTFILESIZE to nie 0 i
  • HISTFILE nie jest rozbrojony.

Ale tylko po wyjściu powłoki lub wykonaniu poleceń history -a(append) lub history -w(write).

Aby uruchomić natychmiastowy zapis na dysk, możesz użyć zmiennej:

 PROMPT_COMMAND='history -a'

które appendto newlinie historii do pliku historii. Są to wiersze historii wprowadzone od początku bieżącej sesji bash, ale jeszcze nie dołączone do pliku historii.

Lub:

 PROMPT_COMMAND='history -w'

Aby zastąpić historię w HISTFILE listą z pamięci.

Możesz więc usunąć polecenie z historii w pamięci:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

I zapisz go na dysk za pomocą ostatniego polecenia:

 history -w    # with `shopt -u histappend` unset
Izaak
źródło
Czy byłoby cokolwiek złego, umieszczając to w pracy crona? Podejrzewam, że wielu użytkowników o znacznie mniejszej liczbie loginów loguje się na konkretny serwer, a mimo to historia jest dość mała i jest to stary serwer, ale być może niektóre sesje nigdy nie są zamykane ...
oneindelijk