Czy pliki historii można ujednolicić w bash?

35

Rutynowo uruchamiam wiele screensesji na komputerach i serwerach z systemem Linux.

Problem polega na tym, że kiedy grepprzeglądam historię poleceń, stwierdzam, że wydałem polecenie w innej sesji i muszę się odłączyć i ponownie dołączyć, aby uzyskać ten element historii.

Czy można „wymusić” różnie zaktualizowane historie z wielu sesji, aby przejść do historii centralnej?

królikarnia
źródło
Natrafiłem na podobny problem, w którym nie byłem w stanie przeglądać historii między sesjami terminalowymi. Okazuje się, że mój plik ~ / .bash_history był własnością roota i nie można go zapisać. Zmiana właściciela / grupę do mojego użytkownik Naprawiono problem: sudo chown <user>: <grupa> ~ / .bash_history
mateo

Odpowiedzi:

41

Musisz zrobić dwie rzeczy:

  1. Wstaw polecenie shopt -s histappenddo swojego .bashrc. Zostanie to dołączone do pliku historii, zamiast go zastąpić.
  2. Również w twoim .bashrc, wstaw, PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"a plik historii zostanie ponownie zapisany i ponownie przeczytany za każdym razem, gdy bash wyświetli monit.

EDYCJA: Dzięki e-t172 za history -nlewę

innaM
źródło
6
Dzięki za to. Udoskonaliłem go dalej, używając PROMPT_COMMAND = "$ PROMPT_COMMAND; historia -a; historia -n". W ten sposób polecenia wydane w innych sesjach natychmiast pojawiają się w historii bieżącej sesji (najpierw musisz nacisnąć Enter, aby zaktualizować historię).
Etienne Dechamps,
8
Nie PROMPT_COMMANDzdefiniowałem wcześniej, więc musiałem użyć, PROMPT_COMMAND="history -a; history -n"aby uniknąć błędów.
William Jackson
1
proszę zobaczyć odpowiedź superuser.com/a/734410/250287, aby uzyskać poprawne komendy historii -a, -c i -r.
mtd
Tylko ostrzeżenie dla przybysza: po pewnym czasie korzystania z przepisywania historii zdałem sobie sprawę, że często wydawałem złe polecenia; kiedy widzisz w poprzednim wierszu jakieś polecenie, oczekujesz, że strzałka w górę je powtórzy, a przy tej konfiguracji nie zawsze tak jest.
Tiago,
11

Proszę nie używać history -a; history -n, nie działa zgodnie z oczekiwaniami i pozostawi wiele zduplikowanych poleceń w historii. Rozwiązanie, które działa ogólnie zgodnie z oczekiwaniami, jest następujące:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Użycie nowego wiersza zamiast średnika jest również krótkim sposobem radzenia sobie z brakującym / zduplikowanym problemem średnika za pomocą PROMPT_COMMAND.

Adam Crane
źródło
historia -a, -c, a następnie -r jest poprawne ... to powinna być zaakceptowana odpowiedź
mtd
1
To exportnie jest konieczne. Ponieważ należy ustawić opcje interaktywnej powłoki, z ~/.bashrcktórej jest wywoływana z każdej podpowłoki, więc dziedziczenie nie jest konieczne.
dolmen
Czy istnieje dobry powód, aby nie używać PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"zamiast tego?
Sześć
To uporządkowanie wymagałoby zapamiętania ostatniej wartości wyjściowej przed uruchomieniem poleceń historii, ponieważ wiele poleceń zachęty opiera się na nich lub wyświetla je.
Adam Crane
-1

PROMPT_COMMAND nie jest domyślnie zdefiniowany w niektórych dystrybucjach. Na przykład jest zdefiniowany w Arch, ale nie w Debianie.

Mam bashrc w moim Dropbox, którego używam podczas przeskakiwania dystrybucji, i obejmuje:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"
czayas
źródło
Okropne rozwiązanie podstawowego problemu z programowaniem powłoki. Właściwa droga:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
dolmen
Lepiej:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
dolmen