Dlaczego historia bash na moim Macu nie chce się zapisać?

28

Zawsze używałem bash do pracy i nigdy nie miałem z tym problemów. Teraz nie zapisuje ponownie żadnego polecenia w historii. Jeśli otworzę okno terminalu, wypróbuję kilka poleceń, działa to tak, jakby wszystko działało dobrze i pokazuje mi historię za pomocą klawiszy strzałek. Ale jeśli zamknę okno (i że jest to czas, który powinien być zapisany w pliku .bash_history) i otworzę kolejne, nie będzie śladów ostatnich poleceń.

Jak mogę dowiedzieć się, co się dzieje? Lub zresetuj wszystko od zera.

abaini01
źródło
Może to być twój profil lub plik rc. Co jest w nich
user14492,
1
Jakie są uprawnienia i właściciel Twojej historii .bash? Moje są 600 i są własnością mnie. Ponadto, co jest w $ HIST_FILE?
blm,
@blm Uprawnienia mają rację; drukując $ HIST_FILE dowiedziałem się o .bash_sessions . Najwyraźniej występują problemy, gdy pod koniec sesji system operacyjny zapisuje ten plik w pliku historii. Nie chcę już tego badać, więc po prostu umieściłem to w moim domu .bash_sessions_disablei wiem, że powraca do domyślnego zachowania
abaini01
Proszę rozważyć zgłoszenie błędu do Apple: developer.apple.com/bug-reporting
Chris Page

Odpowiedzi:

31

Ja to zrobiłem:

Dodaj zmienną do .bash_profilepliku

SHELL_SESSION_HISTORY=0

zrestartuj terminal, a potem będzie działał tak, jak bym chciał. (Zapisał polecenia po zamknięciu terminala)

PS Używam również zmiennych HISTFILESIZEiHISTSIZE

HISTSIZE to liczba wierszy lub poleceń przechowywanych w pamięci na liście historii podczas trwającej sesji bash.

HISTFILESIZE to liczba wierszy lub poleceń, które (a) są dozwolone w pliku historii podczas uruchamiania sesji i (b) są przechowywane w pliku historii na końcu sesji bash do wykorzystania w przyszłych sesjach.

Sysqa
źródło
3
Dodanie tej jednej linii działa dla mnie dobrze na El Capitan, dzięki.
Aidan
2
Dzięki! Chciałbym wiedzieć, dlaczego to też działa, jeśli ktoś się dowie. (Historia = 0 oznaczałoby dla mojego nieświadomego umysłu, że cała historia zostanie utracona, ale wydaje się, że ma to odwrotny skutek.)
Mike Williamson,
@Sysqa Czy jest jakieś rozwiązanie „w środku”? Funkcja „zapisywania i przywracania historii poleceń bash niezależnie dla każdej przywróconej sesji terminala” brzmi jak fajna funkcja, z której może skorzystać program. Czy jest jakiś sposób na uzyskanie korzyści z poprzedniej konfiguracji, a także nowej z jakąś konfiguracją?
loco.loop
8

Począwszy od systemu OS X 10.11 El Capitan , skrypt instalowany w systemie /etc/bashrc_Apple_Terminalkoordynuje z terminalem w celu zapisania / przywrócenia osobnych historii poleceń dla każdego terminalu przywróconego do wznowienia .

Przeczytaj komentarze w /etc/bashrc_Apple_Terminalcelu wyjaśnienia, w jaki sposób zarządza historią poleceń dla poszczególnych terminali i jak ją dostosować.

Jeśli dostosujesz, PROMPT_COMMANDpamiętaj o połączeniu z poprzednią wartością, aby nie wyczyścić polecenia dostarczonego przez system:

PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }your_code_here"

Jeśli zainstalujesz moduł EXITobsługi sygnałów, trappamiętaj, aby zrobić coś podobnego (lub wywołać shell_session_update od swojego modułu obsługi, jeśli nie możesz dowiedzieć się, jak połączyć z poprzednią wartością - jest to trochę zaangażowane).

Po wyjściu z powłoki ten kod zapisze nowe polecenia w historii terminala w ~/.bash_sessions. Aby sprawdzić, czy napotka jakieś problemy, zamiast zamykać terminal ręcznie wyjdź z powłoki ręcznie za pomocą exit(lub Control-D). Rejestruje komunikaty o postępach. Zwróć uwagę, że nie zostanie ukończony lub jeśli zostaną wyświetlone jakiekolwiek ostrzeżenia lub komunikaty o błędach.

Ogólnie rzecz biorąc, bashrc_Apple_Terminalpróbuje wykryć i wyłączyć historię poszczególnych sesji, jeśli wygląda na to, że użytkownik wykonał wszelkie dostosowania, które nie są z nią zgodne. Wygląda na to, że znalazłeś taki, którego nie obsługuje. Proszę rozważyć zgłoszenie błędu w Apple: https://developer.apple.com/bug-reporting/

Chris Page
źródło
Nie wykonałem żadnej specjalnej konfiguracji, więc myślę, że to nie problem. Czy możesz wyjaśnić, co robi PROMPT_COMMAND.
loco.loop
@ loco.loop Czy masz na myśli „Do czego służy zmienna PROMPT_COMMAND firmy Bash?”, czy masz na myśli „Do czego /etc/bashrc_Apple_Terminalsłuży PROMPT_COMMAND?”? Jeśli to drugie, odsyłam do kodu, który jest szczegółowo udokumentowany. Lub powinieneś rozpocząć kolejne pytania na ten temat.
Chris Page
Mam na myśli to, co PROMPT_COMMAND dla ... @ChrisPage
loco.loop
@ loco.loop Odsyłam cię do dokumentacji Bash lub sugeruję, aby rozpocząć na ten temat pytania i odpowiedzi.
Chris Page
6

Tylko w przypadku, istnieją inne, które obecnie nie mają RVM (Ruby Version Manager) zainstalowane: Sprawdź, czy masz następujący wiersz w swoim ~/.profile, ~/.bashrclub ~/.bash_profileplików.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

Prawdopodobnie jest to RVM zapobiegający „hakowi” wyjścia dla uruchomienia bash_sessions.

To był dla mnie problem. Spróbuj to skomentować.

Źródło: Reddit

Nate
źródło
3

W nowej instalacji Mac OS X (zaktualizowanej do 10.13.6) historia poleceń bash nie była zapisywana. Nie było również plików .bashrc ani .bash_profile. W tym przypadku po prostu dodanie pustego pliku .bashrc naprawiło go.

touch .bashrc

To chyba wszystko, czego potrzebujesz ...

Vesal
źródło
wydaje się, że rozwiązuje ten problem również w Mojave / 10.14 :-)
ssc
3

Miałem ten sam problem z nowo zainstalowanym systemem OSX Mojave. Sprawdziłem mój ~/.bash_historyplik i zobaczyłem to:

$ ls -l ~/.bash_history -rw------- 1 root staff 599 Jan 4 20:50 /Users/gilm/.bash_history

Po prostu odesłanie go z powrotem do gilm rozwiązało problem. Użyłem:

sudo chown gilm /Users/gilm/.bash_history

i to rozwiązało mój problem.

gilm
źródło
2

Możesz także utworzyć .bash_logout plik z następującymi elementami:

shell_session_update

Pozyskane z komentarza GitHub

Łowca
źródło
Lub ręcznie wpisz trap shell_session_update EXITraz i wyloguj się. W /etc/bashrc_Apple_Terminalskrypcie znajdują się wskazówki, które są zbyt nudne, aby je tutaj uwzględnić.
MarkHu