Zapisywanie historii bashów z wielu Konsoli nie działa poprawnie

9

Używam wielu terminali Konsole. I chcę, aby wszystkie polecenia, które wpisuję na każdym terminalu, były zapisywane w historii poleceń, aby następna konsola, którą otworzę, miała je wszystkie. Aby zapobiec nadmiernemu zapisywaniu historii poleceń drugiego terminala, podałem następujące ustawienia w moim.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

W ostatnim wierszu podałem ostatni wiersz, aby zobaczyć numer polecenia. Polecenie nr nigdy nie przekroczył 600, ale niektóre z moich starych poleceń znikają z historii. Istnieje wiele poleceń, które są wydawane wielokrotnie, ale zgodnie z oczekiwaniami ignoredups, nigdy nie zwiększa polecenia no w wierszu poleceń. Jednak stare polecenia wciąż znikają, a liczba poleceń w historii zawsze pozostaje nieco ponad 500.

.bash_historyPlik zawiera jeszcze wiele duplikatów pomimo ignoredups.

PS: Wyjście echa $HISTSIZEi $HISTFILESIZEoba są=1000


Aktualizacja: Znalazłem problem w powyższym wpisie do .bashrc. Po prostu wywołanie history -aw PROMPT_COMMANDpo prostu dołącza ostatnią nową komendę do .bash_history. Więc ignoredupsi erasedupsnie mają wpływu.

Czy jest jakiś sposób, nadal mogę pisać do .bash_history bez duplikatów z każdego terminala? Nie chcę ładować całej historii w każdym wierszu polecenia history -ri zapisywać jej ponownie history -w, ponieważ polecenia, które wydałem w jednym terminalu, pojawią się również w innym równolegle działającym terminalu. Chcę, aby połączone polecenia pojawiały się tylko w nowym terminalu.

Zagadka, dlaczego moja historia została przycięta do 500, została rozwiązana. Zauważyłem, że dzieje się to za każdym razem, gdy ssh do tego komputera. Utworzenie .bash_profilez następującym wpisem rozwiązało ten problem.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

Teraz mój plik .bashrc jest wykonywany za każdym razem, gdy ssh też. Rozmiar pliku historii rośnie teraz monotonicznie.

indiajoe
źródło
Czy o to ci chodzi? unix.stackexchange.com/questions/1288/…
jasonwryan
Nie. Chcę uniknąć drugiego wymogu z listy Oli. Nie chcę, żeby historia mojego innego terminalu się pomieszała. Aż uruchomię nowy terminal. To naturalnie dzieje się, gdy właściwie wyłączam maszynę. Ale czasami prawidłowe zamknięcie nie jest możliwe i dopóki nie zapisam historii natychmiast, wszystko zostanie utracone w wyniku nagłego wyłączenia zasilania.
indiajoe
Brzmi bardzo podobnie do pytania pojawiającego się na bug-bashliście mailowej rok po opublikowaniu tego pytania: lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
składnia błąd

Odpowiedzi:

1

Doszedłem do wniosku, że nie można bezpośrednio dodawać nowych poleceń i jednocześnie usuwać duplikatów. Więc moim rozwiązaniem jest uruchomienie następujących poleceń. lub umieścić to w moim crontab.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

Powyższe polecenie zachowa ostatnie wystąpienie polecenia i usunie wszystkie pozostałe powtórzenia nad nim z pliku historii bez zmiany porządku.

indiajoe
źródło
0

To brzydkie i jestem pewien, że sedlub awklepiej, ale próbowałem naprawić ten sam problem, dodając to w moim .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

Spowoduje to utworzenie osobnego pliku historii dla każdego otwieranego terminalu, jednak jeśli uruchomisz bash w bash, użyje tej samej historii, ale nie powinien nadpisywać. Ostrzegam cię z moim zastrzeżeniem. Chociaż to działa i nie pozwala na zastąpienie historii, musisz znaleźć grepwiele plików, aby znaleźć historię, której szukasz, co czasem może być czasochłonne.

umeboshi
źródło