Jak sprawić, by terminal przechowywał osobną historię dla każdej karty / okna?

13

Po ponownym uruchomieniu komputera Mac następuje prawidłowe zamknięcie i zapisanie buforów dla każdej karty, ponieważ jest tam ponownie, gdy komputer uruchamia się ponownie. Ale historia poleceń nie jest odpowiednio buforowana dla okna / karty. Wszystkie mają ten sam bufor.

Zakładam, że dzieje się tak, ponieważ bash używa tego samego ~/.bash_historydla wszystkich terminali, ale czy istnieje sposób, aby tego uniknąć ? Aby zrobić bash, a może Terminal, przechowywać je osobno?

Robert Sköld
źródło
Proszę zobaczyć ten post @ Błąd serwera, wyjaśnia, jak to zrobić.
Mutant

Odpowiedzi:

7

Możesz zrobić coś takiego w swoim .bashrc:

MYTTY=`tty`
HISTFILE=$HOME/.bash_history_`basename $MYTTY`

Spowoduje to utworzenie osobnych plików historii w katalogu domowym, takich jak .bash_history_ttys002. Kiedy utworzysz nowe okno terminala, użyje ono pliku historii odpowiadającego nazwie tty, który zwykle będzie określony po prostu w kolejności, w jakiej utworzysz okno terminala.

Seth Noble
źródło
Wielkie dzięki! Oznaczając to jako rozwiązane. Mimo że to zależy od tego, jak OSX ładuje terminale, mam wrażenie, że jest to najbliższe, jakie możemy uzyskać.
Robert Sköld
Czy jest to również możliwe na zakładkę?
Joshua Muheim
Każda karta to osobny login tty, więc powinna działać.
Seth Noble
Terminal ma wyraźne wsparcie dla tego typu zachowania: gdy tworzy nowy terminal, przypisuje terminalowi unikalny identyfikator i przekazuje go do sesji terminala za pomocą zmiennej środowiskowej TERM_SESSION_ID. Gdy przywraca terminal dla Wznów, przywraca również ten sam identyfikator sesji, więc programy mogą go użyć do powiązania dowolnego stanu z przywróconymi terminalami. Użyj tego jako części nazwy pliku zamiast tty.
Chris Page
@Chris Strona problem polega na tym, że sesja jest inna przy każdym uruchomieniu okna / karty. Stworzyłoby to osobne historie i nie łączyłoby ich między sesjami.
Rene Wooller
5

Zaimplementowałem to, dodając

export HISTFILE="$HOME/.bash_history_$TERM_SESSION_ID"
if [ ! -e $HISTFILE ]; then cp "$HOME/.bash_history" "$HISTFILE"; fi

do mojego ~/.bash_profilepliku. Teraz, kiedy zamykam terminal i otwieram go ponownie, na każdej karcie przywracana jest osobna historia poleceń. Również podczas tworzenia nowej karty inicjowana jest historia domyślna.bash_history

Ponadto, aby Terminalaplikacja zachowała otwarte karty między zamknięciem i ponownym uruchomieniem, musisz upewnić się, że ta opcja "close windows when quitting app" (on Yosemite)jest wyłączona w System Preferences -> General.

Mikael Lepistö
źródło
0

Możesz ustawić niestandardową $ HISTFILE dla każdej instancji terminalu.

Vlad
źródło
Czy istnieje sposób, aby to zrobić automatycznie dla każdej karty / okna terminala? I upewnij się, że używa tego samego, $HISTFILEgdy komputer uruchamia się ponownie?
Robert Sköld,
1
Tak, można to zrobić, ale w jaki sposób miałbyś dostęp ponownie? Musisz ręcznie żonglować plikami, aby przejść do poprzednich plików historii.
EmmEff,
@EmmEff Terminal ma jawne wsparcie dla tego typu zachowania: kiedy tworzy nowy terminal, przypisuje terminalowi unikalny identyfikator i przekazuje go do sesji terminala za pomocą zmiennej środowiskowej TERM_SESSION_ID. Gdy przywraca terminal dla Wznów, przywraca również ten sam identyfikator sesji, więc programy mogą go użyć do powiązania dowolnego stanu z przywróconymi terminalami.
Chris Page