Jak zatrzymać edytowanie historii przez bash, gdy ponownie użyję i zmodyfikuję wpis?

20

Niektóre przypadki bash zmieniają historię poleceń, kiedy ponownie używasz i edytujesz poprzednie polecenie, inne najwyraźniej nie. Szukałem i szukałem, ale nie mogę znaleźć niczego, co mówi, jak zapobiec modyfikowaniu poleceń w historii, gdy są one ponownie używane i edytowane.

Są to pytania, takie jak ten , ale to zdaje się mówić, jak radzić sobie z historią edytowany. Dopiero niedawno natknąłem się na instancję bash, która edytuje historię po ponownym użyciu polecenia - wszystkie poprzednie powłoki bash, których użyłem, zostały (o ile zauważyłem) skonfigurowane tak, aby nie zmieniać historii, gdy ponownie używasz i edytuj polecenie. (Być może po prostu nie zwracałem należytej uwagi na moją historię muszli przez ostatnie 15 lat ...)

To chyba najlepsze pytanie: CZY mogę powiedzieć bash NIGDY nie modyfikować historii - a jeśli tak, to w jaki sposób?

Richard Wiseman
źródło
Możesz użyć history -pgo do rozszerzenia historii bez wpływu na plik historii. Możesz zrobić history -sto samo i dołączyć do historii bez wykonania. Możesz zrobić, HISTIGNORE='start of a command I never want in history.*:command2.*'aby niektóre polecenia pozostały poza historią.
mikeserv
1
Czy set revert-all-at-newline onpytanie, które łączysz, nie rozwiązuje twojego problemu? Czy możesz pokazać, jak odtworzyć problem? Pamiętaj, że możesz również użyć zshdo zachowania bardziej zgodnego z tym, czego chcesz.
Stéphane Chazelas,
@mikeserv Spojrzenie na stronę podręcznika history -pjest czymś, co musiałbym zrobić dla każdego polecenia, którego chcę ponownie użyć - prawda? Jeśli tak, to nie do końca tego szukam. Jak wspomniałem, użyłem wystąpień bash, które nigdy nie modyfikują historii, gdy polecenie jest ponownie używane i edytowane.
Richard Wiseman
@ StéphaneChazelas Nie, nie sądzę, że revert-all-at-newlinejest dokładnie tym, czego potrzebuję. Jeśli edytuję polecenie i naciskam CTRL-C, aby je anulować, nie chcę też, aby wpłynęło to na historię. Nigdy wcześniej nie musiałem konfigurować bash, aby nie modyfikował historii, co jest częściowo powodem, dla którego jestem zdezorientowany, dlaczego czasami nowa instalacja zachowuje się w jeden sposób, a czasem w inny. Nawiasem mówiąc, w instancji, która nie edytuje historii przy ponownym użyciu polecenia, bind -V | grep revertwskazuje, że revert-all-at-newlinejest ustawione na „wyłączone”.
Richard Wiseman,
2
W rzeczywistości ma to bardzo niewiele wspólnego bash. Chodzi o readline. Istnieją różne implementacje readlinebiblioteki, a także ma własny zestaw ustawień (DUŻO z nich) i własny plik konfiguracyjny. Nie jestem pewien, czy jest to ustawienie, czy po prostu różnica w implementacji, ale powinieneś szukać w dokumentacji związanej z readline, a nie bash.
orion

Odpowiedzi:

9

Okazuje się, że revert-all-at-newlineto odpowiedź. Musiałem dołączyć set revert-all-at-newline ondo mojego ~/.inputrcpliku, ponieważ użycie setpolecenia w wierszu polecenia bash nie przyniosło żadnego efektu. (Wtedy oczywiście musiałem założyć nową powłokę.)

Stwierdziłem również, że ~/.inputrcjest ładowany zamiast /etc/inputrc jeśli jest obecny, co oznacza, że ​​wszelkie wartości domyślne zdefiniowane w tym ostatnim nie są już aktywne podczas tworzenia ~/.inputrc. Aby to naprawić, zacznij ~/.inputrcod $include /etc/inputrc.

Dzięki @ StéphaneChazelas za wskazanie mi właściwego kierunku.

Richard Wiseman
źródło
0

W ~ / .bashrc możesz dodać

shopt -s histappend
Jeff Coleman
źródło
Dzięki, ale to nie ma wpływu na występujący problem. Właśnie sprawdziłem i histappendjest włączony, ale moja historia wciąż pokazuje zmiany poprzednich poleceń.
Richard Wiseman,
Przeszukałem stronę podręcznika użytkownika bash i znalazłem zasady dotyczące historii edycji. Nazwy poleceń Readline Jest dość opisowe, ale nie widzę opcji tego, co chcesz, z wyjątkiem może: przerysowania-bieżącej linii Odśwież bieżącą linia.
Jeff Coleman
Istnieje również opcja powrotu do nowej linii, która domyślnie jest wyłączona
Jeff Coleman