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?
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?
Odpowiedzi:
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'
(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
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)
bashpliku wykonywalnym. Napisałbym: „Jest przechowywany bashw pamięci ...”
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.
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).
Podczas działania historia jest przechowywana tylko w pamięci (domyślnie), jeżeli:
Hin in echo "$-") jest ustawiona.0 i*(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:
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
.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.