Po uruchomieniu history
mogę zobaczyć moje ostatnio wykonane polecenia.
Ale jeśli to zrobię tail -f $HISTFILE
lub tail -f ~/.bash_history
nie zostaną wymienione.
Czy plik jest zablokowany, czy istnieje tymczasowa lokalizacja lub coś podobnego?
Po uruchomieniu history
mogę zobaczyć moje ostatnio wykonane polecenia.
Ale jeśli to zrobię tail -f $HISTFILE
lub tail -f ~/.bash_history
nie 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_history
przy 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 -a
polecenia, które:
Dołącz nowe linie historii (linie historii wprowadzone od początku bieżącej sesji Bash) do pliku historii.
Istnieje również -w
opcja:
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_COMMAND
zmiennej:
export PROMPT_COMMAND='history -a'
(Brak odpowiedzi, ale nie mogę dodawać komentarzy)
Jeśli sprawdzasz, .bash_history
ponieważ 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ć export
linię, 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)
bash
pliku wykonywalnym. Napisałbym: „Jest przechowywany bash
w pamięci ...”
Polecenia są zapisywane w pamięci (RAM), gdy sesja jest aktywna. Jak tylko zamkniesz powłokę, lista poleceń zostanie zapisana .bash_history
przed zamknięciem.
Dlatego nie zobaczysz historii bieżącej sesji w .bash_history
.
bash
zakoń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:
H
in 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 append
to new
linie 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_history
plik przypadkowo stanie się własnością root, rzeczy przestaną działać. W takim przypadku sprawdź własność i użyj,sudo
aby naprawić własność w razie potrzeby.