Historia Bash nie jest zachowywana między sesjami terminalowymi na Macu

33

Moja historia bashów w tajemniczy sposób przestała działać i nie mam pojęcia, jak to naprawić. Tak wygląda mój .bashrc:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

Jednak po uruchomieniu echo $HISTFILEdrukuje się /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Jestem właścicielem pliku .bash_history, więc nie jestem pewien, jak bym rozwiązał ten problem.

Dzięki!


źródło
Cześć Nelson, witamy w Super User. Szybkie sprawdzenie tych wstawionych przez Ciebie miejsc?
bertieb
tak, usunę je i zgłośę się.
@bertieb, usunąłem spacje, a teraz $ HISTFILESIZE został poprawnie powtórzony. Historia pozostaje jednak niezapisana, a $ HISTFILE wypisuje ten nieparzysty plik historii temp (który, jak zakładam, przechowuje historię tylko dla tej sesji).
Próbujesz zmienić $HISTFILE, nie interesując się? Nie mam .bashrcOSX i echo $HISTFILEdonosi o miejscu, którego bym się spodziewał - czy komentowanie linii ma jakiś wpływ?
bertieb
1
Zawsze zacytować ścieżka ekspansji zmiennych: HISTFILE="$HOME/.bash_history”. Bez cudzysłowów Twoja wersja będzie nieważna, jeśli ścieżka do katalogu domowego zawiera spacje (lub ewentualnie inne znaki specjalne).
Chris Page

Odpowiedzi:

26

Terminal przypisuje każdej sesji terminala unikalny identyfikator i przekazuje go za pośrednictwem zmiennej środowiskowej TERM_SESSION_ID, dzięki czemu programy działające w terminalu mogą zapisywać / przywracać stan specyficzny dla aplikacji podczas zamykania i ponownego uruchamiania terminala z włączonym wznowieniem.

Nowy folder (~ / .bash_sessions /) służy do przechowywania plików HISTFILE i .session, które są unikalne dla sesji.

Podczas uruchamiania powłoki wykonywany jest plik sesji. Stare pliki są okresowo usuwane.

Domyślne zachowanie umożliwia niezależne zapisywanie i przywracanie historii poleceń bash dla każdej przywróconej sesji terminala. Łączy także polecenia z globalną historią dla nowych sesji.

Możesz wyłączyć to zachowanie i udostępnić jedną historię, ustawiając

export SHELL_SESSION_HISTORY=0

Jeśli zdefiniowano HISTTIMEFORMAT, historia poszczególnych sesji jest domyślnie wyłączona (czytaj więcej w / private / etc / bashrc_Apple_Terminal)

Mechanizm zapisywania / przywracania jest wyłączony, jeśli istnieje następujący plik:

~/.bash_sessions_disable

Apple zmieniło już pewne zachowanie od czasu wydania El Capitan, więc lepiej przeczytać więcej na ten temat tutaj less /private/etc/bashrc_Apple_Terminal

diimdeep
źródło
3
Ale nie zaczynaj od wyłączenia mechanizmu zapisu / przywracania. Jeśli masz problemy z historią poleceń powłoki, spróbuj rozwiązać ten problem. ~/.bash_sessions_disablePlik służy jako ostateczność w przypadku istnieje problem, który nie może być rozwiązany w szczególności. Wyłącza więcej niż tylko historię poleceń na sesję i można wyłączyć tylko historię poleceń na sesję. Zobacz komentarze w, /etc/bashrc_Apple_Terminalaby uzyskać szczegółowe informacje.
Chris Page
1
@ChrisPage Właściwie Apple zmieniło niektóre fragmenty skryptu. Zaktualizowana odpowiedź, dzięki.
diimdeep
@diimdeep Gdzie mam dołączyć tę linię? export SHELL_SESSION_HISTORY=0
zerohedge
@zerohedge .bashrcand .bash_profile unix.stackexchange.com/a/310150/15362
diimdeep
@diimdeep Dziękujemy. To wydaje się działać teraz. Czy ma to jakieś konsekwencje?
zerohedge
6

Zauważyłem coś podobnego po aktualizacji El Capitan. Po prostu dodanie pliku .bash_sessions_disablepliku do katalogu domowego wyłącza nowe sesje bash i .bash_historyjest z powrotem w użyciu.

Ten wątek Reddit zawiera więcej informacji i dalsze linki.

rabs
źródło
Ale nie zaczynaj od wyłączenia mechanizmu zapisu / przywracania. Jeśli masz problemy z historią poleceń powłoki, spróbuj rozwiązać ten problem. ~/.bash_sessions_disablePlik służy jako ostateczność w przypadku istnieje problem, który nie może być rozwiązany w szczególności. Wyłącza więcej niż tylko historię poleceń na sesję i można wyłączyć tylko historię poleceń na sesję. Zobacz komentarze w, /etc/bashrc_Apple_Terminalaby uzyskać szczegółowe informacje.
Chris Page
Dzięki Chris - co jeszcze to wyłącza, moja historia działała zgodnie z oczekiwaniami (taka sama jak poprzednia wersja osx i taka sama jak linux) przez ostatnie kilka miesięcy. Nie wiesz, dlaczego to zmienili?
rabs
@rabs Sugeruję dodanie SHELL_SESSION_HISTORY=0na górze ~/.bash_profile.
Teejay
5

Możesz rozwiązać problem RVM poprzez aktualizację do najnowszej wersji RVM lub wykonanie tego:

  echo 'shell_session_update' > $HOME/.bash_logout

Aby uzyskać więcej informacji, zobacz https://github.com/rvm/rvm/issues/3540

Alex Rojo
źródło
1
Dobra poprawka, bez konieczności modyfikacji rvm.
mlo55
1
Czy mówimy o Ruby enVironment Manager (RVM) rvm.io ? Kiedy i dlaczego należy się zaangażować?
MarkHu
3

Ta odpowiedź z wątku Reddit uratowała mnie:

Prawdopodobnie jest to RVM zapobiegający „hakowi” wyjścia dla uruchomienia bash_sessions. Jeśli skomentujesz następujący wiersz w pliku .bash_profile, powinien on działać.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
noio
źródło
To rzeczywiście pomogło!
Karsten
1

Jeśli jest to komputer Mac, domyślnie jest to domyślna powłoka logowania bashi działa ona .profilezamiast .bashrc. Edytowałeś niewłaściwy plik.

theoden
źródło
Zredagowałem .profile, więc jest taki sam jak mój .bashrc, a historia wciąż się nie pojawia.
@NelsonLiu Co się stanie, gdy rozlegniesz się echem $HISTFILEw różnych częściach profile? Być może źródło innego skryptu, który zmienia zmienną? Sprawdziłem zarówno Terminala iTerm, bash 3i 4 obie mają swoje domyślne $HOME/.bash_history.
theoden
jak mam echo $ HISTFILE w różnych częściach profilu?
@NelsonLiu, czy to nie oczywiste? Twoim celem jest śledzenie $HISTFILEzmian. Dlatego po prostu ustaw dwa echo $HISTFILEotaczające kod. Musisz znaleźć fragment kodu, w którym $HISTFILEzmienia się, przesuwając obie echo $HISTFILElinie coraz bliżej siebie, linia po linii, aż coś się ujawni. To wszystko.
theoden
1
więc zrobiłem zgodnie z instrukcją i utworzyłem .bash_profile taki sam jak profil. Zdecydowałem się echo $HISTFILEna każdą linię, żeby zobaczyć, czy są jakieś różnice. Jednak wydrukował /Users/username/.bash_historyzaledwie niezliczoną ilość razy. Potem pobiegłem echo $HISTFILEw powłoce i wyszedł /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.
0

Widziałem ten problem w High Sierra. Jakoś moja własna .bash_history stała się własnością roota i nawet nie miała uprawnień do odczytu dla innych użytkowników (gdy zawartość katalogu domowego przeglądana za pomocą ls -al)

W tym pliku .bash_history nie było żadnych konsekwencji, więc zrobiłem sudo rm .bash_history, a następnie dotknąłem .bash_history, aby utworzyć nowy.

Wszystko wydaje się teraz dobrze

Julian Jordan
źródło
Dla mnie to nie były uprawnienia do plików, tylko to, że nie zdefiniowałem żadnej ze zmiennych sterujących HIST. Najwyraźniej jeden lub więcej z nich musi zostać zdefiniowanych. Dodałem to do mojego ~/.bash_profilepliku:export HISTTIMEFORMAT='%F %T '
MarkHu