Po pierwsze, nie jest to duplikat istniejących wątków na SE. Przeczytałem te dwa wątki ( 1. , 2. ) o lepszej historii basha, ale żadna z odpowiedzi nie działa - - tak przy okazji, jestem na Fedorze 15.
Dodałem następujące do .bashrc
pliku w katalogu użytkownika (/ home / aahan /) i to nie działa. Czy ktoś ma jakiś pomysł?
HISTCONTROL=ignoredups:erasedups # no duplicate entries
HISTSIZE=1000 # custom history size
HISTFILESIZE=100000 # custom history file size
shopt -s histappend # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" # Save and reload the history after each command finishes
Okej, właśnie tego chcę z historią bash (priorytet):
- nie przechowuj duplikatów, usuń wszystkie istniejące
- natychmiast udostępniaj historię wszystkim otwartym terminalom
- zawsze dołączaj historię, a nie zastępuj ją
- przechowuj polecenia wieloliniowe jako pojedyncze polecenie (domyślnie wyłączone)
- jaki jest domyślny rozmiar Historii i rozmiar pliku historii?
bash
command-history
to ja
źródło
źródło
echo $SHELL
). Czy ustawienia działają, jeśli uruchomisz je ręcznie z otwartej powłoki? Oczywiście, ponieważ działają one dla tak wielu innych ustawień, są prawidłowe, po prostu źle je wdrażasz. I żadna Fedora15 / Gnome3 / będąca maszyną wirtualną nie ma wiele wspólnego z faktyczną funkcjąbash
..bashrc
pliku. Czy to źle? Czy możesz dodać „odpowiedź” do tego postu za pomocą rzeczywistych poleceń powłoki? (proszę znoszą moją.bashrc
JEST rzeczywistymi poleceniami powłoki. Skrypty to tylko seria poleceń powłoki. Również edytowanie, które ostatnio usunąłeś,export
było złym pomysłem, który należy zachować.Odpowiedzi:
To jest naprawdę bardzo interesujące zachowanie i przyznaję, że na początku nie doceniłem tego pytania. Ale najpierw fakty:
1. Co działa
Funkcjonalność można uzyskać na kilka sposobów, ale każdy działa nieco inaczej. Zauważ, że w każdym przypadku, aby historia została „przeniesiona” do innego terminala (zaktualizowana), należy nacisnąć Enterterminal, w którym chce on odzyskać historię.
opcja 1:
Ma to dwie wady:
Opcja 2:
(Tak, nie ma potrzeby
shopt -s histappend
i tak, musi byćhistory -c
w środkuPROMPT_COMMAND
) Ta wersja ma również dwie ważne wady:history
Komenda może dać fałszywe wyjścia - patrz poniżej.[Edytuj] „A zwycięzcą jest ...”
opcja 3:
To jest tak daleko, jak to możliwe. Jest to jedyna opcja, aby
erasedups
historia i wspólna historia działały jednocześnie. To prawdopodobnie ostateczne rozwiązanie wszystkich twoich problemów, Aahan.2. Dlaczego opcja 2 wydaje się nie działać (lub: co tak naprawdę nie działa zgodnie z oczekiwaniami)?
Jak wspomniałem, każde z powyższych rozwiązań działa inaczej. Ale najbardziej myląca interpretacja działania ustawień wynika z analizy wyników
history
polecenia . W wielu przypadkach polecenie może dawać fałszywe dane wyjściowe. Dlaczego? Ponieważ jest wykonywany przed sekwencją innychhistory
poleceń zawartych wPROMPT_COMMAND
! Jednak podczas korzystania z drugiej lub trzeciej opcji można monitorować zmiany.bash_history
treści (używającwatch -n1 "tail -n20 .bash_history"
na przykład) i zobaczyć, jaka jest prawdziwa historia.3. Dlaczego opcja 3 jest tak skomplikowana?
Wszystko zależy od sposobu
erasedups
działania. Jak stwierdza instrukcja bash, „(...)erasedups
powoduje usunięcie wszystkich poprzednich wierszy pasujących do bieżącego wiersza z listy historii przed zapisaniem tego wiersza” . Więc to jest naprawdę to, co chciał OP (a nie tylko, jak wcześniej sądzono, nie mieć duplikaty występujące w sekwencji ) . Oto dlaczego każde zhistory -.
poleceń musi albo nie może znajdować się wPROMPT_COMMAND
:history -n
musi być tam przedhistory -w
odczytem.bash_history
poleceń zapisanych z dowolnego innego terminala,history -w
ma być tam, aby zapisać historię do pliku i usunąć duplikaty,history -a
nie należy go tam umieszczać zamiasthistory -w
, ponieważ nie powoduje to usunięcia duplikatów,history -c
jest również potrzebny, ponieważ zapobiega usuwaniu bufora historii po każdym poleceniu,i wreszcie
history -r
jest potrzebny do przywrócenia bufora historii z pliku, a tym samym do udostępnienia historii między sesjami terminalowymi.źródło
watch "tail -n 20 .bash_history"
zamiasttail -f .bash_history
.history -c
jest również potrzebny, ponieważ zapobiega usuwaniu do pamięci bufora historii po każdym poleceniu. Dlaczego takie śmieci występują?W poleceniu polecenia używasz
-c
przełącznika. Odman bash
:Aby udostępnić swoją historię wszystkim otwartym terminalom, możesz użyć
-n
:Rozmiar domyślny znajduje się również w instrukcji:
Aby zapisać polecenia wieloliniowe:
Ponadto nie powinieneś poprzedzać poleceń HIST *
export
- są to zmienne tylko bash, a nie zmienne środowiskowe:HISTCONTROL=ignoredups:erasedups
jest wystarczające.źródło
export PROMPT_COMMAND="history -a; history -n; history -r; $PROMPT_COMMAND"
prawda? Czy wiesz także, jak mogę sprawić, by plik historii przechowywał polecenia wieloliniowe jako jedno polecenie (które jest domyślnie wyłączone)?shopt -s cmdhist
zapisuje się wiele wierszy.HISTCONTROL=ignoredups:erasedups
to, że nie działa. Próbowałem też mieć to w.bashrc
pliku (wśród funkcji niestandardowych). Masz pojęcie, co może być nie tak? Używam Fedory 15 na maszynie wirtualnej - na hoście Windows 7./etc/bashrc
, co.bash_profile
by je przesłaniało..bash_profile
plikiem. Jeśli chodzi o treść,/etc/bashrc
którą tu umieściłem, proszę spojrzeć - pastebin.com/Uae6sE6sWłaśnie to wymyśliłem i jak dotąd jestem z tego zadowolony…
UWAGI:
HISTIGNORE
ignoruje wszystkie polecenia, które nie mają argumentów. Może to nie być pożądane przez niektórych ludzi i może zostać pominięte.źródło
Użyj tego zamiast:
źródło
To nie działa, ponieważ zapominasz o:
Ale wydaje się, że
history -n
jest po prostu błędny, gdyexport HISTCONTROL=ignoreboth:erasedups
działa.Pozwala eksperymentować:
Tutaj włączamy usuwanie duplikatów, przełączamy historię na niestandardowy plik, usuwamy historię. Po zakończeniu wszystkich poleceń mamy pusty plik historii i jedno polecenie w bieżącej historii.
Otwórz drugi terminal i uruchom te sześć poleceń. Po tym:
Teraz twoja historia ma dwa polecenia, a plik historii ma:
Powrót do pierwszego terminala:
Huh ... żadne z
echo
poleceń nie zostało odczytane. Przełącz ponownie na drugi terminal i:Teraz plik historii to:
Przełącz ponownie na pierwszy terminal:
Możesz zobaczyć, że
echo "Z"
polecenie zostało scalonehistory -n
.Innym błędem jest to, że polecenia są odczytywane z historii według numeru polecenia, a nie według czasu polecenia, tak myślę. Oczekuję, że
echo
w historii pojawiły się inne poleceniaźródło
skasowane nie usuwa przycinania (jak chomp w niektórych językach) początkowych i końcowych spacji. To jest błąd. Usunięte dane również nie usuwają wszystkich poprzednich wpisów.
źródło