Jak zsynchronizować historię poleceń sesji terminalowej w bash?

13

Próbowałem wyszukać ~/.bash_historymoje ostatnie polecenia podczas sesji terminalowej, ale ich po prostu nie było. Chyba dlatego, że mam otwartych wiele sesji terminali.

Czy istnieje sposób na zsynchronizowanie (tj. Synchronizację-wypychanie lub synchronizację-wypisanie) historii poleceń bieżącej sesji terminala w pliku bash_history (bez zamykania sesji i utraty tego środowiska)?

(Pomysł byłby zdalnie podobny do tego, w jaki sposób syncpolecenie przechowuje modyfikacje systemu plików w niektórych systemach).

Wyobrażam sobie, że mógłbym ustawić bash, aby zachować historię wielu sesji, ale możliwość wypchnięcia bieżącego bufora historii byłaby nadal przydatna w scenariuszach, gdy pracujesz na nowym komputerze i przypadkowo zapomniałeś ustawić bash tak, jak byś chciał .

n611x007
źródło
Próbowałem history -a wbudowanego polecenia powłoki, ale po jakimś czasie otrzymuję „odmowę .bash_historydostępu ” do pliku.
n611x007
Duplikowane pytanie. Zobacz: unix.stackexchange.com/questions/1288/…
Eduardo Leggiero

Odpowiedzi:

19

Dodaj tę linię do .bashrc:

export PROMPT_COMMAND="history -a; history -n"

Otwórz nowy terminal i sprawdź.

Wyjaśnienie

  • history -a dołącza nowe wiersze historii do pliku historii.
  • history -nkaże bashczytać wiersze, które nie są odczytywane z pliku historii do bieżącej listy historii sesji.
  • PROMPT_COMMAND: zawartość tej zmiennej jest uruchamiana jako zwykłe polecenie przed bashwyświetleniem monitu. Tak więc za każdym razem, gdy wykonujesz polecenie, history -a; history -njest ono wykonywane, a twoja bashhistoria jest synchronizowana.
Cuonglm
źródło
dzięki! Nie wiem, dlaczego wcześniej odmówiono mi pozwolenia, ale w przypadku nowych terminali wydaje się, że działa to zgodnie z oczekiwaniami! Myślę, że normalnie powinienem być w stanie używać również history -aw terminalu z niezmodyfikowanym bashrc.
n611x007
kiedy trzeba zacząć się martwić konsekwencjami związanymi z wydajnością? (Myślę o urządzeniach z
niższej półki
1
Być może masz już polecenie zachęty, w tym przypadku lepiej jest użyćexport PROMPT_COMMAND="${PROMPT_COMMAND};history -a; history -n"
Fabian
Jeśli ${PROMPT_COMMAND}jest pusty, to oznacza błąd z powodu wiodącego;
Borisa Däppena
@ BorisDäppen ma rację, ale łatwo temu zaradzićexport PROMPT_COMMAND="${PROMPT_COMMAND}${PROMPT_COMMAND:+;}history -a; history -n"
TML