Mangled History

15

W trybie GUI, kiedy użytkownik ma więcej niż jeden terminal otwarty, w jaki sposób terminale przepisują plik historii tego użytkownika? powodem, dla którego pytam, jest to, że jest całkiem możliwe, że w każdym z terminali użytkownik kończy wykonywanie różnych poleceń. Czy zatem plik historii zapisuje polecenia ze wszystkich terminali, czy tylko od pierwszego, który zostanie otwarty? Czy jest jakiś inny program, który stosuje się w celu rozwiązania tej sytuacji?

Sójka
źródło

Odpowiedzi:

11

Zależy to całkowicie od tego, jak powłoka zdecyduje się go obsłużyć

bashdomyślnie nadpisuje plik historii lokalną historią każdej powłoki po jej wyjściu, więc wygrywa ostatnia powłoka, która wyjdzie. Ta histappendopcja powoduje, że zamiast tego dołącza się do historii wzorcowej ( shopt -s histappend).

zsh robi to samo domyślnie i ma kilka opcji radzenia sobie z tym:

  • appendhistory - Historia każdej powłoki jest dołączana do głównego pliku historii po wyjściu z powłoki
  • incappendhistory - Główny plik historii jest aktualizowany za każdym razem, gdy wiersz jest wykonywany w dowolnej powłoce, zamiast czekać na wyjście z tej powłoki
  • sharehistory- Podobnie jak incappendhistory, ale także pobiera zmiany z głównego pliku historii do wszystkich działających powłok, dzięki czemu można uruchomić polecenie w jednej powłoce, a następnie nacisnąć Upinną powłokę i zobaczyć
Michał Mrożek
źródło
A teraz powiedz mi, jak to zrobić w Bash;)
tante
1
@tante shopt -s histappendnie działa?
Michael Mrozek
0

Pierwotnie wpadłem na ten pomysł z książki O'Reilly „Unix Power Tools”.

W moim .profileustawiłem:

export HISTFILE=$HOME/.sh_hist.$$

Za każdym razem .profile, gdy czytam, otrzymuję nowy plik historii o nazwie PID mojej sesji. Jeśli mam wiele loginów, każdy login otrzymuje unikalny plik historii. Działa w kshi bash.

Jeśli otwierasz nowe terminale w sesji X, zwykle nie są to powłoki logowania, ale możesz je skonfigurować tak, aby działały jak powłoki logowania. Na przykład rxvt +lsrozpocznie się rxvtjako powłoka logowania. Sprawdź dokumenty dla dowolnego terminalu, którego używasz.

Ponadto, chyba że używasz pliku .logoutlub .bash_logout(lub innych środków) do czyszczenia, w końcu będziesz mieć crapload .sh_histplików.

mazianni
źródło
0

tcsh: set savehist = (5000 merge)łączy się

użytkownik39122
źródło