W systemie Linux, powłoka rejestruje historię wykonywanych poleceń, co pozwala na ich przeszukiwanie i powtarzanie. Zrozumienie polecenia historii w Linuksie oraz jego właściwe wykorzystanie może znacząco zwiększyć Twoją efektywność.
Zarządzanie historią
Jak powiedział George Santayana: „Ci, którzy nie pamiętają przeszłości, są skazani na jej powtarzanie”. W przypadku Linuksa, brak pamięci o przeszłych poleceniach sprawia, że trudno je powtórzyć, mimo chęci.
W tym kontekście, polecenie historii w Linuksie staje się niezwykle przydatne. Umożliwia przeglądanie oraz powtarzanie wcześniejszych komend. Nie chodzi tylko o wygodę czy zaoszczędzenie czasu – kluczowa jest również wydajność oraz precyzja. Im bardziej złożone jest polecenie, tym trudniej je zapamiętać i wpisać bez błędów. Błędy mogą przybierać różne formy: jeden z nich uniemożliwia wykonanie polecenia, drugi zaś pozwala na jego wykonanie, ale prowadzi do niezamierzonych rezultatów.
Polecenie historii skutecznie redukuje te problemy. Jak wiele innych poleceń w Linuksie, ma więcej do zaoferowania, niż się wydaje. Jeśli jednak nauczysz się, jak z niego korzystać, może znacznie uprościć codzienną pracę w terminalu systemu Linux. To inwestycja, która przyniesie korzyści. Istnieje wiele bardziej efektywnych metod korzystania z polecenia historii niż ciągłe naciskanie klawisza strzałki w górę.
Polecenie historii
Najprostszy sposób użycia polecenia historii to po prostu wpisać jego nazwę:
history
W terminalu pojawi się lista wcześniejszych poleceń.
Wszystkie polecenia są ponumerowane, a najnowsze znajdują się na końcu listy.
Aby wyświetlić określoną liczbę poleceń, wystarczy podać tę liczbę jako argument. Na przykład, aby zobaczyć 10 ostatnich używanych poleceń, wpisz:
history 10
Możesz uzyskać ten sam efekt, używając polecenia tail. Aby to zrobić, wpisz:
history | tail -n 10
Powtarzanie poleceń
Aby ponownie użyć polecenia z listy historii, należy wpisać wykrzyknik (!) oraz numer polecenia, bez spacji między nimi.
Na przykład, aby powtórzyć polecenie numer 37, wprowadź:
!37
Aby powtórzyć ostatnie polecenie, wystarczy wpisać podwójny wykrzyknik:
!!
To może być przydatne, gdy zapomnisz użyć sudo przed wydaniem polecenia. W takim przypadku wpisz sudo, dodaj jedną spację, następnie podwójne wykrzykniki, a potem naciśnij Enter.
Na przykład, jeśli wydasz polecenie wymagające sudo, zamiast przepisywać je w całości, można zaoszczędzić kilka kliknięć, wpisując sudo !!, jak pokazano poniżej:
mv ./my_script.sh /usr/local/bin/
sudo !!
Możesz użyć jednego wykrzyknika, znaku minus (-) oraz numeru wcześniejszego polecenia (bez spacji), aby je powtórzyć.
Aby powtórzyć 13. poprzednie polecenie, wpisz:
!-13
Wyszukiwanie poleceń według ciągu
Aby powtórzyć ostatnie polecenie, które zaczyna się od określonego ciągu, wpisz wykrzyknik, następnie ten ciąg, a potem naciśnij Enter.
Na przykład, aby powtórzyć ostatnie polecenie rozpoczęte od sudo, wpisz:
!sudo
Jednakże, to może być ryzykowne. Jeśli ostatnie polecenie uruchomione z sudo nie jest tym, o którym myślałeś, możesz wykonać niewłaściwe polecenie.
Aby zapewnić sobie dodatkowe bezpieczeństwo, możesz użyć modyfikatora: p (print), jak pokazano poniżej:
!sudo:p
To polecenie wydrukuje w terminalu odpowiednią komendę, zamiast jej wykonać. Dzięki temu masz okazję zweryfikować, czy to polecenie jest tym, które chcesz wykonać. Jeśli tak, naciśnij strzałkę w górę, a następnie Enter, aby je wykorzystać.
Jeśli chcesz wyszukać polecenie zawierające określony ciąg, możesz użyć wykrzyknika oraz znaku zapytania.
Na przykład, aby znaleźć i wykonać pierwsze polecenie zawierające słowo „aliasy”, wpisz:
!?aliases
To polecenie znajdzie każde wcześniejsze polecenie zawierające ciąg „aliasy”, niezależnie od jego położenia.
Interaktywne wyszukiwanie
Interaktywne wyszukiwanie pozwala na przeskakiwanie przez listę pasujących poleceń i powtarzanie tego, które chcesz.
Aby rozpocząć wyszukiwanie, wystarczy nacisnąć Ctrl + R.
W miarę wprowadzania wskazówki, pierwsze pasujące polecenie zostanie wyświetlone. Wpisywane litery pojawią się między lewym apostrofem (`) a apostrofem (’). Pasujące polecenia będą aktualizowane z każdym wprowadzonym znakiem.
Za każdym razem, gdy naciśniesz Ctrl + R, wyszukujesz wstecz następne pasujące polecenie, które wyświetli się w terminalu.
Po naciśnięciu Enter, polecenie zostanie wykonane.
Aby edytować polecenie przed jego wykonaniem, naciśnij klawisze strzałki w lewo lub w prawo.
Polecenie będzie widoczne w wierszu poleceń, co umożliwi jego edytowanie.
Możesz również skorzystać z innych narzędzi w Linuksie do przeszukiwania historii. Na przykład, aby przekazać dane wyjściowe z historii do grep i wyszukać polecenia zawierające ciąg „aliasy”, użyj tego polecenia:
history | grep aliases
Modyfikowanie ostatniego polecenia
Jeśli chcesz poprawić literówkę w ostatnim poleceniu, możesz użyć znaku daszka (^), aby je zmodyfikować. To przydatna sztuczka, gdy przypadkowo wpiszesz błędne polecenie lub chcesz je ponownie uruchomić z inną opcją.
Aby to zrobić, wpisz (bez spacji) znak daszka, tekst do zamiany, kolejny daszek, tekst zastępujący, jeszcze jeden daszek, a następnie naciśnij Enter.
Na przykład, jeśli przypadkowo wpisałeś „shhd” zamiast „sshd”, wpisz:
sudo systemctl start shhd
Możesz to łatwo poprawić, wpisując:
^shhd^sshd^
W ten sposób polecenie zostanie wykonane z poprawionym „sshd”.
Usuwanie poleceń z listy historii
Możesz także usunąć polecenia z listy historii, korzystając z opcji -d (usuń). Nie ma sensu trzymać błędnie napisanych poleceń w historii.
Możesz użyć grep, aby znaleźć określone polecenie, przekazać jego numer do historii z opcją -d, a następnie wyszukać ponownie, aby upewnić się, że zostało usunięte:
history | grep shhd
history -d 83
history | grep shhd
Możesz również przekazać zakres poleceń do opcji -d. Aby usunąć wszystkie wpisy od 22 do 32 (włącznie), wpisz:
history -d 22 32
Aby usunąć tylko pięć ostatnich poleceń, możesz użyć liczby ujemnej, na przykład:
history -d -5
Ręczna aktualizacja pliku historii
Kiedy logujesz się lub otwierasz sesję terminala, lista historii jest wczytywana z pliku .bash_history. Jak sama nazwa wskazuje, to plik, w którym przechowywana jest historia.
Wszelkie zmiany dokonane w bieżącej sesji terminala są zapisywane do pliku historii dopiero po zamknięciu okna terminala lub wylogowaniu się.
Jeśli chcesz otworzyć inne okno terminala i mieć dostęp do pełnej listy historii, w tym poleceń z pierwszego okna, użyj opcji -a (all) przed otwarciem drugiego okna.
Aby wykonać tę operację, wpisz:
history -a
W ten sposób polecenia są zapisywane w pliku historii.
Jeśli chcesz zapisać wszystkie zmiany na liście historii do pliku (na przykład po usunięciu starych poleceń), użyj opcji -w (write), na przykład:
history -w
Czyszczenie listy historii
Aby usunąć wszystkie polecenia z listy historii, użyj opcji -c (clear) w następujący sposób:
history -c
Jeśli chcesz wymusić te zmiany w pliku historii, użyj opcji -w, na przykład:
history -w
Bezpieczeństwo i plik historii
Podczas korzystania z aplikacji, które wymagają wprowadzenia poufnych informacji (takich jak hasła) w terminalu, pamiętaj, że te informacje również zostaną zapisane w pliku historii. Jeśli nie chcesz, aby pewne dane były zapisywane, możesz użyć poniższej struktury poleceń, aby natychmiast je usunąć z listy historii:
special-app my-secret-password;history -d $(history 1)
history 5
W tej strukturze znajdują się dwa polecenia oddzielone średnikiem (;). Rozłóżmy to:
special-app: nazwa używanej aplikacji.
my-secret-password: hasło, które musimy podać dla aplikacji.
history -d: drugie polecenie, które usuwa ostatnie polecenie z historii.
$ (history 1): używa podstawiania poleceń. Część polecenia zawarta w $ () jest wykonywana w podpowłoce. Wynik tego wykonania jest zwracany jako tekst w pierwotnym poleceniu. Więc history 1 zwraca ostatnie polecenie. Można więc myśleć o drugim poleceniu jako o history -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.
Istnieje jednak 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
Polecenie z hasłem nie zostanie dodane do listy historii. Powód, dla którego ta sztuczka działa, jest określony w pliku .bashrc.
Plik .bashrc
Plik .bashrc jest wykonywany za każdym razem, gdy logujesz się lub otwierasz okno terminala. Zawiera również kilka ustawień, które kontrolują zachowanie polecenia historii. Otwórz ten plik za pomocą gedit.
Wpisz następujące polecenie:
gedit .bashrc
Na początku pliku znajdziesz dwie wartości:
HISTSIZE: maksymalna liczba wpisów, jakie może zawierać lista historii.
HISTFILESIZE: maksymalny limit liczby wierszy w pliku historii.
Te dwie wartości współdziałają w następujący sposób:
Kiedy logujesz się lub uruchamiasz sesję terminala, lista historii jest zapełniana z pliku .bash_history.
Gdy zamykasz terminal, maksymalna liczba poleceń ustawiona w HISTSIZE jest zapisywana w pliku .bash_history.
Jeśli opcja 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, aby zawierał nie więcej niż HISTFILESIZE wierszy.
Na początku pliku znajduje się także wpis dotyczący wartości HISTCONTROL.
Możesz ustawić tę wartość, aby wykonać jedną z poniższych 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 zdefiniować konkretne polecenia, które chcesz zignorować, oddzielając je dwukropkiem (:) i umieszczając w cudzysłowie („…”).
Aby dodać wiersz do pliku .bashrc i zdefiniować polecenia do zignorowania, użyj poniższej struktury:
export HISTIGNORE="ls:history"
Używanie znaczników czasu
Jeśli chcesz dodać znaczniki czasu do historii, ustaw HISTTIMEFORMAT. Wystarczy dodać poniższy wiersz do pliku .bashrc:
export HISTTIMEFORMAT="%c "
Upewnij się, że przed zamknięciem cudzysłowu znajduje się spacja. Zapobiega to łączeniu się znaku czasu z poleceniami na liście.
Teraz, gdy wpiszesz polecenie history, zobaczysz datę i znaczniki czasu. Zwróć uwagę, że wszystkie polecenia z historii przed dodaniem znaczników czasu będą miały datę i godzinę pierwszego polecenia, które otrzyma znacznik czasu. W poniższym przykładzie polecenie 118 otrzymało znacznik czasu.
Możesz spersonalizować format znaczników czasu, używając różnych tokenów. Oto niektóre z nich:
%d: dzień
%m: miesiąc
%y: rok
%H: godzina
%M: minuty
%S: sekundy
%F: pełna data (rok-miesiąc-dzień)
%T: czas (godzina:minuta:sekunda)
%c: pełny znacznik daty i czasu (dzień-miesiąc-rok godzina:minuta:sekunda)
Spróbujmy użyć kilku różnych tokenów:
export HISTTIMEFORMAT="%d n%m %T "
Wyniki będą zawierać dzień, miesiąc i godzinę.
Usunięcie dnia i miesiąca spowoduje wyświetlenie jedynie godziny.
Wszystkie zmiany w HISTTIMEFORMAT mają wpływ na całą historię. Dzieje się tak, ponieważ czas dla każdego polecenia jest przechowywany jako liczba sekund od epoki Uniksa. Dyrektywa HISTTIMEFORMAT po prostu określa format, w jakim ten czas będzie wyświetlany w czytelnej formie.
export HISTTIMEFORMAT="%T "
Teraz wyniki będą bardziej przejrzyste.
Możesz także użyć polecenia historii do audytów. Czasami przeglądanie wcześniejszych poleceń może pomóc zidentyfikować, co mogło spowodować problem.
Jak w życiu, w Linuksie również możesz wykorzystać polecenie historii, aby na nowo przeżyć dobre chwile oraz uczyć się na błędach.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.