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!


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


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.


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


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"

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.