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_history
Plik zawiera jeszcze wiele duplikatów pomimo ignoredups.
PS: Wyjście echa $HISTSIZE
i $HISTFILESIZE
oba są=1000
Aktualizacja: Znalazłem problem w powyższym wpisie do .bashrc
. Po prostu wywołanie history -a
w PROMPT_COMMAND
po prostu dołącza ostatnią nową komendę do .bash_history. Więc ignoredups
i erasedups
nie 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 -r
i 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_profile
z 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.
źródło
bug-bash
liście mailowej rok po opublikowaniu tego pytania: lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.htmlOdpowiedzi:
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.
Powyższe polecenie zachowa ostatnie wystąpienie polecenia i usunie wszystkie pozostałe powtórzenia nad nim z pliku historii bez zmiany porządku.
źródło
To brzydkie i jestem pewien, że
sed
lubawk
lepiej, ale próbowałem naprawić ten sam problem, dodając to w moim.bashrc
: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źć
grep
wiele plików, aby znaleźć historię, której szukasz, co czasem może być czasochłonne.źródło