Bardzo lubię korzystać control+r
z rekurencyjnego przeszukiwania historii poleceń. Znalazłem kilka dobrych opcji, z którymi lubię się z tym korzystać:
# ignore duplicate commands, ignore commands starting with a space
export HISTCONTROL=erasedups:ignorespace
# keep the last 5000 entries
export HISTSIZE=5000
# append to the history instead of overwriting (good for multiple connections)
shopt -s histappend
Jedynym problemem dla mnie jest to, że erasedups
usuwa tylko sekwencyjne duplikaty - dzięki czemu za pomocą tego ciągu poleceń:
ls
cd ~
ls
ls
Komenda faktycznie będą rejestrowane dwukrotnie. Myślałem o okresowym uruchamianiu w / cron:
cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history
Pozwoliłoby to na usunięcie duplikatów, ale niestety kolejność nie zostałaby zachowana. Jeśli nie sort
najpierw plik, nie sądzę, że uniq
może działać poprawnie.
Jak mogę usunąć duplikaty z mojej historii .bash, zachowując porządek?
Dodatkowy kredyt:
Czy są jakieś problemy z nadpisaniem .bash_history
pliku za pomocą skryptu? Na przykład, jeśli usuniesz plik dziennika Apache, myślę, że musisz wysłać sygnał nohup / reset, kill
aby umożliwić mu opróżnienie połączenia z plikiem. Jeśli tak jest w przypadku .bash_history
pliku, być może mógłbym w jakiś sposób ps
sprawdzić i upewnić się, że nie ma połączonych sesji przed uruchomieniem skryptu filtrującego?
ignoredups
zamiast tegoerasedups
i zobacz, jak to działa dla Ciebie.history
polecenia. Gdzie powinienem szukać?Odpowiedzi:
Sortowanie historii
To polecenie działa podobnie
sort|uniq
, ale utrzymuje linie na miejscuZasadniczo wstawia do każdej linii swój numer. Po zakończeniu
sort|uniq
wszystkie linie są sortowane z powrotem zgodnie z ich pierwotną kolejnością (przy użyciu pola numeru linii), a pole numeru linii jest usuwane z linii.Takie rozwiązanie ma tę wadę, że nie jest zdefiniowane, który reprezentant klasy równych linii sprawi, że będzie on na wyjściu, a zatem jego pozycja na końcowym wyjściu jest niezdefiniowana. Jeśli jednak należy wybrać najnowszego przedstawiciela, możesz
sort
wprowadzić dane drugim przyciskiem:Zarządzanie .bash_history
Do ponownego czytania i zapisywania historii można użyć odpowiednio
history -a
ihistory -w
.źródło
sort
pomocy-r
przełącznik zawsze odwraca kolejność sortowania. Ale to nie da rezultatu, który masz na myśli.sort
uważa dwa wystąpienials
za identyczne z wynikiem, że nawet po odwróceniu ostateczna kolejność zależy od algorytmu sortowania. Ale zobacz moją aktualizację dla innego pomysłu.nl
na początku każdej linii kodu? Nie powinno tak byćhistory
?Tak więc szukałem dokładnie tego samego po denerwowaniu przez duplikaty i stwierdziłem, że jeśli edytuję mój ~ / .bash_profile (Mac) za pomocą:
Robi dokładnie to, co chciałeś, zachowuje tylko najnowsze polecenia.
ignoreboth
jest tak naprawdę jak robienieignorespace:ignoredups
i to wraz zerasedups
wykonaniem pracy.Przynajmniej na moim terminalu Mac z bash to działa idealnie. Znalazłem go tutaj na askubuntu.com .
źródło
Znalazłem to rozwiązanie na wolności i przetestowałem:
Przy pierwszym wyświetleniu określonej wartości linii (0 USD) wartość x [0 USD] wynosi zero.
Wartość zero jest odwracana
!
i staje się jednością.Instrukcja, której wynikiem jest jeden, powoduje domyślne działanie, którym jest print.
Dlatego przy pierwszym wyświetleniu określonego
$0
jest on drukowany.Za każdym razem (powtórzenia) wartość
x[$0]
jest zapisywana,jej wartość zanegowana wynosi zero, a instrukcja, która zwraca zero, nie jest drukowana.
Aby zachować ostatnią powtarzaną wartość, odwróć historię i użyj tego samego awk:
źródło
Rozszerzanie odpowiedzi Clayton:
tac
odwróć plik, upewnij się, że masz zainstalowany,moreutils
aby byłsponge
dostępny, w przeciwnym razie użyj pliku tymczasowego.źródło
brew install coreutils
i zwróć uwagę, że wszystkie narzędzia GNU są przygotowane,g
aby uniknąć pomyłek z wbudowanymi komendami MacD BSD (np. Gsed to GNU, a sed to BSD). Więc użyjgtac
.Pozwoli to zachować ostatnie zduplikowane linie:
źródło
To stary post, ale wieczny problem dla użytkowników, którzy chcą mieć otwartych wiele terminali i synchronizować historię między oknami, ale nie powielać.
Moje rozwiązanie w .bashrc:
history -n
odczytuje wszystkie wiersze z $ HISTFILE, które mogły wystąpić w innym terminalu od ostatniego powrotu karetkihistory -w
zapisuje zaktualizowany bufor do $ HISTFILEhistory -c
czyści bufor, aby nie nastąpiło powielaniehistory -r
ponownie odczytuje $ HISTFILE, dołączając do teraz pustego buforatac
cofa go, a następnie cofa do tyłu, aby można go było zapisać za pomocą najnowszych poleceń, wciąż najnowszych w historiiZa każdym razem, gdy otwierasz nową powłokę, historia usuwa wszystkie duplikaty i za każdym razem, gdy naciśniesz Enterklawisz w innym oknie powłoki / terminala, aktualizuje tę historię z pliku.
źródło
Jednoznaczne zarejestrowanie każdego nowego polecenia jest trudne. Najpierw musisz dodać
~/.profile
lub podobne:Następnie musisz dodać do
~/.bash_logout
:źródło