historia nie jest zachowana w Zsh

18

Ilekroć otwieram nową instancję terminala, historia jest pusta. Dlaczego? Czy muszę coś skonfigurować? Jednak w bash nie ma takiej potrzeby.

Gilles „SO- przestań być zły”
źródło
Nie jestem pewien zsh, ale domyślnie bashzapisuje do swoich plików historii przy wyjściu , co oznacza, że ​​jeśli nie używałeś go wcześniej i nie otworzyłeś niektórych powłok, wszystkie one będą teraz wyświetlać historię, dopóki przynajmniej jeden się nie wyloguje, zapisując w ten sposób swój plik historii.
DopeGhoti

Odpowiedzi:

25

Bash i zsh mają różne ustawienia domyślne. Zsh domyślnie nie zapisuje historii w pliku.

Gdy uruchomisz zsh bez pliku konfiguracyjnego, wyświetli się interfejs konfiguracyjny. W tym interfejsie konfiguracyjnym wybierz

(1)  Configure settings for history, i.e. command lines remembered
     and saved by the shell.  (Recommended.)

następnie przejrzyj proponowane ustawienia i wybierz

# (0)  Remember edits and return to main menu (does not save file yet)

Powtórz te czynności dla pozostałych podmenu dla (2) zakończenia, (3) skrótów klawiszowych i (4) opcji, a następnie wybierz

(0)  Exit, saving the new settings.  They will take effect immediately.

z menu głównego.

Zalecane ustawienia związane z historią to

HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt appendhistory

Użyłbym innej nazwy dla pliku historii, aby wskazać, że jest to plik historii zsh. W nowoczesnym systemie można zwiększyć 1000 linii.

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt appendhistory

Nawiasem ~/.zshrcmówiąc, te linie wchodzą .

Gilles „SO- przestań być zły”
źródło
10

Chociaż istniejąca odpowiedź jest poprawna, pomyślałem, że warto dodać, że istnieje prawdopodobnie lepsza opcja niż appendhistoryzapisanie historii i tak jest SHARE_HISTORY.

Z dokumentów SHARE_HISTORY„oba importują nowe polecenia z pliku historii, a także powodują, że wpisane polecenia są dołączane do pliku historii”. Oznacza to, że muszle również znają swoją historię bez konieczności zamykania obecnej lub otwierania nowej.

Więc razem ustawilibyście to w ten sposób:

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=1000
setopt SHARE_HISTORY
bert
źródło
1
+1 i witamy w U / L, ale osobiście wolę INC_APPEND_HISTORY_TIME, który zapisuje historię ze wszystkich terminali jak wyżej, ale ta historia „nie będzie dostępna od razu z innych instancji powłoki korzystających z tego samego pliku historii”. Ma to dla mnie większy sens, ponieważ wtedy mogę osobno przeglądać historię każdego terminala, ale nadal wszystko jest rejestrowane.
Sparhawk
2
Dzięki! Tak, to dość sprawiedliwe i całkowicie rozumiem, dlaczego INC_APPEND_HISTORY_TIMEmoże mieć to bardziej logiczny sens. Prawdopodobnie nie powinienem był mówić „lepiej”, myślę, że w tym momencie jest to tylko kwestia osobistych preferencji!
bert
0

kiedy po raz pierwszy przełączysz się z bash na zsh, twoja historia bash nie zostanie przeniesiona. Więc cała historia, którą miałeś w bash, jest nadal w pliku historii bash. Zsh zaczyna przechwytywać historię od momentu, gdy zaczniesz używać jej jako powłoki.

Jeśli nie skonfigurowałeś go do przechwytywania historii, możesz ponownie uruchomić kreatora konfiguracji i powiedzieć zsh, ile historii zapisać. Zmień nazwę ~ / .zshrc lub usuń ją, aby uzyskać nowe ujęcie kreatora.

LocoCoyote
źródło
0

Jeśli to nie działa, a masz to wszystko na swoim miejscu, spróbuj:

fc -W

To zapisuje bieżącą historię do pliku historii. A jeśli otrzymasz:

zsh: locking failed for /home/username/.zsh_history: permission denied

nadszedł czas, aby sprawdzić uprawnienia do pliku i katalogu nadrzędnego.

Chris Snyder
źródło