Jak korzystać z polecenia historii w systemie Linux

Powłoka Linuksa zapisuje historię uruchamianych poleceń i możesz ją przeszukiwać, aby powtórzyć polecenia, które wykonałeś w przeszłości. Kiedy zrozumiesz polecenie historii Linuksa i jak go używać, może znacznie zwiększyć produktywność.

Manipulowanie historią

Tak jak George Santayana powiedział słynnym słowem, „Ci, którzy nie pamiętają przeszłości, są skazani na jej powtarzanie”. Niestety w Linuksie, jeśli nie pamiętasz przeszłości, nie możesz jej powtórzyć, nawet jeśli chcesz.

Wtedy przydaje się polecenie historii Linuksa. Umożliwia przeglądanie i powtarzanie poprzednich poleceń. Nie chodzi tylko o zachęcanie do lenistwa lub oszczędność czasu – w grze jest również czynnik wydajności (i dokładności). Im dłuższe i bardziej skomplikowane jest polecenie, tym trudniej je zapamiętać i wpisać bez popełnienia błędu. Istnieją dwa rodzaje błędów: jeden, który uniemożliwia wykonanie polecenia, i drugi, który umożliwia jego działanie, ale powoduje, że robi coś nieoczekiwanego.

Polecenie historii eliminuje te problemy. Jak większość poleceń Linuksa, jest w tym coś więcej niż myślisz. Jeśli jednak nauczysz się korzystać z polecenia historii, może ono usprawnić korzystanie z wiersza poleceń systemu Linux każdego dnia. To dobra inwestycja Twojego czasu. Istnieją znacznie lepsze sposoby korzystania z polecenia historii niż wielokrotne naciskanie strzałki w górę.

Dowództwo historii

W najprostszej formie możesz użyć polecenia historii, po prostu wpisując jego nazwę:

history

Plik

Lista poprzednio używanych poleceń jest następnie zapisywana w oknie terminala.

Przykład danych wyjściowych z

Polecenia są ponumerowane, a ostatnio używane (te o najwyższych numerach) znajdują się na końcu listy.

Aby zobaczyć określoną liczbę poleceń, możesz przekazać liczbę do historii w wierszu poleceń. Na przykład, aby zobaczyć 10 ostatnio użytych poleceń, wpisz:

history 10

Plik

Możesz osiągnąć ten sam wynik, jeśli przepuścisz historię przez polecenie ogon. Aby to zrobić, wpisz:

history | tail -n 10

Plik

Powtarzanie poleceń

Jeśli chcesz ponownie użyć polecenia z listy historii, wpisz wykrzyknik (!) I numer polecenia bez spacji między nimi.

Na przykład, aby powtórzyć polecenie numer 37, wpisz następujące polecenie:

!37

Na

Aby powtórzyć ostatnie polecenie, ponownie wpisz dwa wykrzykniki bez spacji:

!!

Na

Może to być przydatne, gdy wydajesz polecenie i zapomnisz użyć sudo. Wpisz sudo, jedną spację, podwójne wykrzykniki, a następnie naciśnij Enter.

W poniższym przykładzie wpisaliśmy polecenie, które wymaga sudo. Zamiast przepisywać całą linię, możemy zapisać kilka naciśnięć klawiszy i po prostu wpisać sudo !!, jak pokazano poniżej:

mv ./my_script.sh /usr/local/bin/
sudo !!

Na

Możesz więc wpisać odpowiednią liczbę z listy, aby powtórzyć polecenie, lub użyć podwójnych wykrzykników, aby powtórzyć ostatnie użyte polecenie. A co jeśli chcesz powtórzyć piąte lub ósme polecenie?

Możesz użyć jednego wykrzyknika, łącznika (-) i numeru dowolnego poprzedniego polecenia (ponownie bez spacji), aby je powtórzyć.

Aby powtórzyć 13. poprzednie polecenie, wpisz:

!-13

Na

Wyszukiwanie poleceń według łańcucha

Aby powtórzyć ostatnie polecenie, które zaczyna się od określonego ciągu, możesz wpisać wykrzyknik, a następnie ciąg bez spacji, a następnie nacisnąć klawisz Enter.

Na przykład, aby powtórzyć ostatnie polecenie rozpoczęte od sudo, wpisz następujące polecenie:

!sudo

Na

Jest w tym jednak element niebezpieczeństwa. Jeśli ostatnie polecenie uruchomione z sudo nie jest tym, o którym myślisz, uruchomisz niewłaściwe polecenie.

Aby jednak zapewnić siatkę bezpieczeństwa, możesz użyć modyfikatora: p (print), jak pokazano poniżej:

!sudo:p

Na

To nakazuje historii wydrukować polecenie w oknie terminala, zamiast go wykonywać. Pozwala to zobaczyć polecenie przed jego użyciem. Jeśli jest to polecenie, które chcesz, naciśnij strzałkę w górę, a następnie naciśnij klawisz Enter, aby go użyć.

Jeśli chcesz znaleźć polecenie zawierające określony ciąg, możesz użyć wykrzyknika i znaku zapytania.

Na przykład, aby znaleźć i wykonać pierwsze pasujące polecenie zawierające słowo „aliasy”, należy wpisać następujące polecenie:

!?aliases

Na

Spowoduje to znalezienie dowolnego polecenia zawierającego ciąg „aliasy”, niezależnie od tego, gdzie występuje w ciągu.

Wyszukiwanie interaktywne

Interaktywne wyszukiwanie umożliwia przeskakiwanie listy pasujących poleceń i powtarzanie tego, które chcesz.

Po prostu naciśnij Ctrl + R, aby rozpocząć wyszukiwanie.

Okno terminala po

W miarę wpisywania wskazówki wyszukiwania pojawi się pierwsze pasujące polecenie. Wpisywane litery pojawiają się między lewym apostrofem (`) a apostrofem (’). Pasujące polecenia są aktualizowane w miarę wpisywania każdej litery.

ZA

Za każdym razem, gdy naciśniesz Ctrl + r, szukasz do tyłu następnego pasującego polecenia, które pojawia się w oknie terminala.

ZA

Po naciśnięciu klawisza Enter wyświetlone polecenie zostanie wykonane.

Plik

Aby edytować polecenie przed jego wykonaniem, naciśnij klawisz strzałki w lewo lub w prawo.

ZA

Polecenie pojawia się w wierszu poleceń i można je edytować.

Polecenie w wierszu poleceń z włączoną edycją.

Możesz użyć innych narzędzi Linuksa do przeszukiwania listy historii. Na przykład, aby potokować dane wyjściowe z historii do grep i wyszukaj polecenia zawierające ciąg „Aliasy”, możesz użyć tego polecenia:

history | grep aliases

Plik

Modyfikowanie ostatniego polecenia

Jeśli chcesz poprawić literówkę, a następnie powtórzyć polecenie, możesz użyć daszka (^), aby je zmodyfikować. To świetna sztuczka, aby mieć w zanadrzu za każdym razem, gdy błędnie wpiszesz polecenie lub chcesz je ponownie uruchomić z inną opcją lub parametrem wiersza poleceń.

Aby go użyć, wpisz (bez spacji) daszek, tekst, który chcesz zamienić, inny daszek, tekst, którym chcesz go zastąpić, inny daszek, a następnie naciśnij Enter.

Na przykład załóżmy, że wpisujesz następujące polecenie, przypadkowo wpisując „shhd” zamiast „sshd”:

sudo systemctl start shhd

Możesz to łatwo poprawić, wpisując:

^shhd^sshd^

ZA

Polecenie jest wykonywane z „shhd” poprawionym na „sshd”.

Usuwanie poleceń z listy historii

Możesz także usuwać polecenia z listy historii za pomocą opcji -d (usuń). Nie ma powodu, aby trzymać błędnie napisane polecenie na liście historii.

Możesz użyć grep, aby go znaleźć, przekazać jego numer do historii za pomocą opcji -d, aby go usunąć, a następnie wyszukać ponownie, aby upewnić się, że zniknął:

history | grep shhd
history -d 83
history | grep shhd

Plik

Możesz także przekazać szereg poleceń do opcji -d. Aby usunąć wszystkie wpisy listy od 22 do 32 (włącznie), wpisz to polecenie:

history -d 22 32

Aby usunąć tylko pięć ostatnich poleceń, możesz wpisać liczbę ujemną, na przykład:

history -d -5

Ręczna aktualizacja pliku historii

Kiedy logujesz się lub otwierasz sesję terminala, lista historii jest wczytywana z pliku historii. W Bash domyślnym plikiem historii jest .bash_history.

Wszelkie zmiany wprowadzone w bieżącej sesji okna terminala są zapisywane w pliku historii dopiero po zamknięciu okna terminala lub wylogowaniu się.

Załóżmy, że chcesz otworzyć inne okno terminala, aby uzyskać dostęp do pełnej listy historii, w tym poleceń wpisanych w pierwszym oknie terminala. Opcja -a (all) pozwala na zrobienie tego w pierwszym oknie terminala przed otwarciem drugiego.

Aby z niego skorzystać, wpisz:

history -a

Plik

Polecenia są zapisywane po cichu w pliku historii.

Jeśli chcesz zapisać wszystkie zmiany na liście historii do pliku historii (jeśli usunąłeś na przykład niektóre stare polecenia), możesz użyć opcji -w (zapis), na przykład:

history -w

Plik

Czyszczenie listy historii

Aby usunąć wszystkie polecenia z listy historii, możesz użyć opcji -c (wyczyść) w następujący sposób:

history -c

historia -c w oknie terminala

Jeśli chcesz dodatkowo wymusić te zmiany w pliku historii, użyj opcji -w, na przykład:

history -w

Bezpieczeństwo i plik historii

Jeśli używasz aplikacji, które wymagają wpisania poufnych informacji (takich jak hasła) w wierszu poleceń, pamiętaj, że zostaną one również zapisane w pliku historii. Jeśli nie chcesz, aby pewne informacje były zapisywane, możesz użyć następującej struktury poleceń, aby natychmiast usunąć je z listy historii:

special-app my-secret-password;history -d $(history 1)
history 5

ZA

Ta struktura zawiera dwa polecenia oddzielone średnikiem (;). Rozbijmy to:

special-app: nazwa programu, którego używamy.
moje-tajne-hasło: Tajne hasło, które musimy podać dla aplikacji w wierszu poleceń. To już koniec pierwszego polecenia.
history -d: W drugim poleceniu wywołujemy opcję -d (usuń) historii. To, co zamierzamy usunąć, znajduje się w następnej części polecenia.
$ (historia 1): Używa podstawiania poleceń. Część polecenia zawarta w $ () jest wykonywana w podpowłoce. Wynik tego wykonania jest publikowany jako tekst w pierwotnym poleceniu. Polecenie history 1 zwraca poprzednie polecenie. Możesz więc myśleć o drugim poleceniu jako o historii -d „ostatnie polecenie tutaj”.

Możesz użyć polecenia history 5, aby upewnić się, że polecenie zawierające hasło zostało usunięte z listy historii.

Jest jednak na to jeszcze prostszy sposób. Ponieważ Bash domyślnie ignoruje wiersze zaczynające się spacją, wystarczy umieścić spację na początku wiersza w następujący sposób:

 special-app another-password
history 5

ZA

Polecenie z hasłem nie jest dodawane do listy historii. Powód, dla którego ta sztuczka działa, jest zawarty w pliku .bashrc.

Plik .bashrc

Plik .bashrc jest wykonywany za każdym razem, gdy logujesz się lub otwierasz okno terminala. Zawiera również pewne wartości, które kontrolują zachowanie polecenia historii. Edytujmy ten plik za pomocą gedit.

Wpisz następujące informacje:

gedit .bashrc

Plik

U góry pliku zobaczysz dwa wpisy:

HISTSIZE: Maksymalna liczba wpisów, jakie może zawierać lista historii.
HISTFILESIZE: Limit liczby wierszy, które może zawierać plik historii.

Te dwie wartości oddziałują na siebie w następujący sposób:

Kiedy logujesz się lub uruchamiasz sesję okna terminala, lista historii jest zapełniana z pliku .bash_history.
Gdy zamykasz okno terminala, maksymalna liczba poleceń ustawiona w HISTSIZE jest zapisywana w pliku .bash_history.
Jeśli opcja powłoki histappend jest włączona, polecenia są dołączane do .bash_history. Jeśli histappend nie jest ustawiony, plik .bash_history jest zastępowany.
Po zapisaniu poleceń z listy historii do .bash_history, plik historii jest obcinany tak, aby zawierał nie więcej niż HISTFILESIZE wierszy.

Również u góry pliku znajduje się wpis dotyczący wartości HISTCONTROL.

Plik

Możesz ustawić tę wartość, aby wykonać jedną z następujących czynności:

ignorespaces: wiersze zaczynające się spacją nie są dodawane do listy historii.
ignoredups: zduplikowane polecenia nie są dodawane do pliku historii.
ignoreboth: Włącza oba powyższe.

Możesz także wyświetlić konkretne polecenia, których nie chcesz dodawać do listy historii. Oddziel je dwukropkiem (:) i umieść w cudzysłowie („…”).

Należy postępować zgodnie z tą strukturą, aby dodać wiersz do pliku .bashrc i zastąpić polecenia, które mają być ignorowane:

export HISTIGNORE="ls:history"

Na

Korzystanie ze znaczników czasu

Jeśli chcesz dodać znaczniki czasu do listy historii, możesz użyć ustawienia HISTIMEFORMAT. Aby to zrobić, wystarczy dodać wiersz podobny do poniższego do pliku .bashrc:

export HISTTIMEFORMAT="%c "

Zwróć uwagę, że przed zamykającymi cudzysłowami znajduje się spacja. Zapobiega to łączeniu się sygnatury czasowej z poleceniami na liście poleceń.

Na

Teraz, gdy uruchomisz polecenie historii, zobaczysz datę i znaczniki czasu. Zwróć uwagę, że wszystkie polecenia, które były na liście historii przed dodaniem znaczników czasu, będą oznaczone datą i godziną pierwszego polecenia, które otrzyma znacznik czasu. W poniższym przykładzie było to polecenie 118.

Lista historii ze znacznikami czasu w oknie terminala.

To bardzo rozwlekły znacznik czasu. Możesz jednak użyć innych tokenów niż% c, aby ją udoskonalić. Inne tokeny, których możesz użyć, to:

%dzień D
% m: miesiąc
% y: rok
% H: godzina
% M: minuty
% S: sekundy
% F: Pełna data (format rok-miesiąc-data)
% T: czas (format godzina: minuty: sekundy)
% c: Kompletny znacznik daty i czasu (format dzień-data-miesiąc-rok i godzina: minuty: sekundy)

Poeksperymentujmy i użyjmy kilku różnych tokenów:

export HISTTIMEFORMAT="%d n%m %T "

Eksport HISTTIMEFORMAT =

Dane wyjściowe wykorzystują dzień, miesiąc i godzinę.

Lista historii ze znacznikami czasu w oknie terminala.

Jeśli jednak usuniemy dzień i miesiąc, pokaże się tylko godzina.

Wszelkie zmiany wprowadzone w HISTIMEFORMAT dotyczą całej listy historii. Jest to możliwe, ponieważ czas dla każdego polecenia jest przechowywany jako plik liczba sekund od epoki Uniksa. Dyrektywa HISTTIMEFORMAT po prostu określa format używany do renderowania tej liczby sekund w stylu czytelnym dla człowieka, na przykład:

export HISTTIMEFORMAT="%T "

Plik

Nasza produkcja jest teraz łatwiejsza w zarządzaniu.

Lista historii ze znacznikami czasu w oknie terminala.

Możesz także użyć polecenia historii do audytu. Czasami przejrzenie poleceń używanych w przeszłości może pomóc zidentyfikować, co mogło spowodować problem.

Tak jak w życiu, w Linuksie możesz użyć polecenia historii, aby ponownie przeżyć dobre czasy i uczyć się na złych.