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.


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.


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/


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


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 ...


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.


2

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

shell_session_update

Pozyskane z komentarza GitHub


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
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.