Utrata historii Bash podczas korzystania z histappend

18

Lubię przechowywać dużo historii, więc histappendpostanowiłem .bashrc. Przez większość czasu wszystko działa dobrze, a historia składa się z wielu dołączonych powłok. Jednak co jakiś czas uruchamiam nową powłokę i stwierdzam, że straciłem całą historię - i często zawiera tylko niektóre polecenia z ostatniej powłoki do wyjścia (tj. Nie jest to tylko nadpisywanie zamiast dodawania ). Z tego powodu jestem podejrzany, że dzieje się to przy wyjściu z powłoki, a nie z innego procesu powodującego zabicie .bash_historypliku. Popierając ten wniosek, mam numery poleceń w historii i nigdy nie widziałem, żeby spadały.

Czy ktoś miał kiedyś podobny problem? A może po prostu masz sugestie, jak wyśledzić problem?

Cascabel
źródło

Odpowiedzi:

13

Przepraszam, że odpowiadam na własne pytanie, ale żadna z pozostałych odpowiedzi tak naprawdę nie rozwiązuje problemu.

W końcu doszedłem do wniosku, że dzieje się tak tylko podczas zamykania gnome-terminalsię (tj. File> exit, przycisk „x”, alt + F4), a nawet wtedy ogólnie tylko przy zamykaniu kilku terminali w krótkim odstępie czasu. Nigdy nie zdarza się to, gdy używasz Ctrl-D do zamykania powłoki, pozwalając terminalowi podążać.

Jeśli uda mi się go odpowiednio sprecyzować, prześlę raport o błędzie terminalu gnome. Tymczasem być może pomoże to innym osobom, które dostaną się tutaj z Google!

Cascabel
źródło
10

Nie mam pojęcia, dlaczego tak się dzieje, ale być może uda ci się obejść problem, zmuszając bash do zapisywania pliku historii za każdym razem, gdy wyświetla monit:

PROMPT_COMMAND="history -a; history -n"

Spowoduje to zapisanie (-a), a następnie ponowne odczytanie (-n) pliku historii za każdym razem, gdy bash poprosi o następne polecenie. Dodatkowa korzyść: otrzymasz polecenie X w powłoce 1 w historii powłoki 2.

innaM
źródło
Nie działa na GNU bash, wersja 3.00.15 (1) -release (i686-redhat-linux-gnu)
David Mackintosh
2
Czy możesz wyjaśnić, co oznacza „nie działa”?
innaM
3
Dodatkowa korzyść, którą przytaczasz, jest w wielu przypadkach wadą. Nie jest to zachowanie, którego szukam, ponieważ mogę wykonywać dwa całkowicie oddzielne zadania w osobnych powłokach i nie chcę przenikać ich historii. To też prawdopodobnie nic nie pomoże. Kiedy historia znika, usuwa zawartość .bash_history - nie sądzę, że będzie miało znaczenie, czy zostały napisane przy wyjściu z powłoki, czy przez PROMPT_COMMAND.
Cascabel,
5
history -njest łuszcząca się. Jest to bardziej niezawodne history -a; history -c; history -r. Aby to wyjaśnić, najpierw zauważę, że history -arobi to dobrze - .bash_historybędzie zawierać wszystkie twoje polecenia, które wpisałeś, w kolejności, w jakiej je wpisałeś - przy założeniu, że wykonujesz history -apo każdym poleceniu. Wyzwanie polega na zsynchronizowaniu pomysłu historii powłoki z plikiem .bash_history. Jest to łatwe -ci -rproblem polega na tym, że może być powolny, jeśli jest duży. -nmoże się zepsuć, ponieważ nieprawidłowo określa, które linie są nowe. (Brakuje mi tutaj miejsca!)
Aaron McDaid,
4
(... jeśli używasz -n) Wyobraź sobie, że wykonanie polecenia w skorupkach 1: ls. Następnie w innej powłoce, Shell Two, wykonujesz cd. Teraz historia w .bash_history jest poprawna, ponieważ history -aw twoim PROMPT_COMMAND- będzie zawierać ls \n cd \n. Następnie wróć do powłoki One i wpisz pwd. Shell One uważa , że było tylko polecenie w historii ( ls). Teraz uważa, że w historii są dwa polecenia ( lsi pwd). Gdy to zrobisz -n, myśli (mam dwie komendy w mojej historii, a w .bash_history są dwie komendy, dlatego jestem na bieżąco.)
Aaron McDaid,
3

Z mojego doświadczenia wynika, że ​​powłoki zaktualizowały plik historii w momencie wyjścia. Tak więc początkowa „historia” powłoki zależała od ostatnio opowiedzianego przez nią widoku historii.

Wynikiem tego jest to, że możesz otrzymywać polecenia przychodzące i wychodzące z historii, w zależności od tego, jak uruchomiono i zatrzymano inne powłoki.

David Mackintosh
źródło
2
Bardzo dobrze rozumiem, w jaki sposób zapisany jest plik historii - dlatego w pytaniu podałem, że go używam histappend. Problemem nie są nieoczekiwane treści, ale całkowita utrata wcześniej zapisanych treści.
Cascabel,
To wyjaśnia, dlaczego straciłem historię ...
B, 7
1

Widziałem to wcześniej, ale był to problem z błędami dysku, które pojawiały się coraz częściej. Uruchomiłbym skan na dysku. Jeśli okaże się, że dysk jest w porządku, sprawdziłbym, czy ten plik nie przekracza arbitralnego limitu historii powłoki.

Coś, co mogłoby temu zapobiec, polegałoby na ponownym przycinaniu pliku z powrotem do 80 wierszy lub dowolnej liczbie poleceń, jakie powinna mieć historia.

Axxmasterr
źródło
Nie mam dostępu do roota na komputerze, na którym to się dzieje, ale jestem całkiem pewien, że dysk jest w porządku. Mój katalog domowy jest przechowywany na serwerze w naszym laboratorium (chyba RAID) i zamontowany w systemie NFS. Co rozumiesz przez „arbitralny limit historii powłoki”? To wszystko dzieje się znacznie poniżej HISTSIZE i HISTFILESIZE, i chociaż mam oba ustawione duże, są one znacznie poniżej intbasha, w którym je przechowują.
Cascabel,
Muszę powiedzieć, że wpis Davida Mackintosha jest prawdopodobnie tym, co się dzieje.
Axxmasterr
1
Jestem całkowicie pewien, że tak nie jest. Nigdy nie powinienem skończyć z tylko dwoma poleceniami w mojej historii, kiedy ostatnia powłoka do wyjścia miała kilkadziesiąt poleceń, plik historii miał kilkaset, a HISTSIZE / HISTFILESIZE są ustawione na 10000.
Cascabel