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?

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ć

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.


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.