Bash history, czyli jak poruszać się w historii poleceń w Linuksie?


 

Jakiś czas temu opisywaliśmy w jaki sposób korzystać z historii poleceń w CMD. Oczywiście staramy się zachować odpowiednią równowagę oraz uniknąć niepotrzebnych dyskusji na temat wyższości jednego systemu operacyjnego nad drugim, więc dziś przyszedł czas na: „bash history”, czyli w wolnym tłumaczeniu: „Zrobiłem coś kiedyś w Linuksie i chciałbym wiedzieć co to było.” lub też: „kilka tygodni temu wykonałem bardzo długą komendę i nie chce mi się jej pisać na nowo”. Poniżej przedstawiamy kilka zwięzłych porad jak efektywnie wykorzystywać polecenie history w Linuksie. Wierzymy, że ułatwią Wam życie i pomogą efektywnie pracować.

Przeszukiwanie bash history

Poza standardowymi „strzałka w górę”/ „strzałka w dół” istnieje także możliwość wykorzystania Ctrl+P zamiast „strzałki w górę”. Możemy również przeszukiwać historię poleceń pod kątem użytych wcześniej stringów. Aby przejść w ten tryb przeszukiwania historii poleceń bash należy nacisnąć kombinację klawiszy Ctrl+R. W wyniku tej operacji otrzymamy nieco inny znak zachęty:

(reverse-i-search)`’:

W tym trybie, gdy będziemy chcieli wyszukać np. polecenie „mtr” wpisujemy „mtr” po dwukropku:

(reverse-i-search)`mtr’: mtr www.wp.pl

Teraz możemy wykonać to polecenie wciskając klawisz Enter, lub wciskając klawisz Tab przejść do trybu „normalnego” w bash i np. zmodyfikować polecenie.

Poprzednie polecenie

Można także wywołać poprzednie polecenia w następujące 2 sposoby (z pominięciem znanej wszystkim „strzałki w górę” i Ctrl+P):

  • dla ostatniego polecenia:

# !!

  • dla 4 poleceń wstecz:

# !-4

Wykonanie konkretnego polecenia z historii

Historia poleceń bash przechowywana jest dla każdego użytkownika osobno w pliku oznaczonym zmienną $HISTFILE

# echo $HISTFILE

/root/.bash_history

Jest to zwykły plik tekstowy. Można więc oczywiście wyświetlić jego zawartość:

# cat -n /root/.bash_history
1 passwd
2 apt-get install skype
3 ps aux 4 tcpdump -w test.pcap -i wlan0 src 10.0.2.15
4 ping -c 2 8.8.8.8
5 tcpdump -w test.pcap -i wlan0 src 10.0.2.15
6 tcpdump -ttttnnr test.pcap

Lub wykorzystując polecenie bash history

# history
1 passwd
2 apt-get install skype
3 ps aux
4 ping -c 2 8.8.8.8
5 tcpdump -w test.pcap -i wlan0 src 10.0.2.15
6 tcpdump -ttttnnr test.pcap

Teraz gdy znamy już historię poleceń jesteśmy w stanie odwołać się do konkretnego polecenia wybierzmy na przykład 4 polecenie:

# !4
ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=49 time=34.1 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=49 time=18.1 ms

Tworzenie skryptu z poprzednich poleceń

Jeśli wykonaliśmy kilka poleceń, których będziemy używać w takiej kolejności w przyszłości, możemy zapisać je do pliku, a plik uczynić wykonywalnym skryptem.

# ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
# history 2 > google.test
# chmod +x google.test
# ./google.test
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets

W powyższym przykładzie zapisaliśmy dwa poprzednie polecenia, dla np 6 ostatnich będzie to:

# history 6 > inny.skrypt

Jednak takie działanie ma pewną wadę. Domyślacie się jaką? Odpowiedzi proszę zostawiać w komentarzach. Podpowiedź – proszę sprawdźcie jaki wynik daje polecenie bash history.

Operacje na poleceniach

Bardzo ciekawą opcją jakie daje nam zarządzanie komendami bash history jest wykorzystywanie parametrów z poprzednich poleceń.

# mkdir /home/user/test
# cd !!:$
cd /home/user/test

Użycie !!:$ po cd wywoła komendę cd z parametrem poprzedniego polecenia.

# mv /home/user/test/plik /home/user
# cd !mv:2
cd /home/user

Powyżej używamy odwołania do poprzednio użytej komendy mv i używamy jej drugiego parametru

Kasowanie historii poleceń bash

Historia poleceń jest przechowywana tak naprawdę w dwóch miejscach jedno miejsce to opisany wyżej plik bash_history (gdzie po zakończeniu danej sesji powłoki dopisywana jest historia poleceń danej sesji), a drugie to „historia sesji” którą otrzymujemy w wyniku polecenia powłoki bash history (wynik tego polecenia będzie różny dla każdej sesji powłoki nawet dla tego samego użytkownika). Skasowanie tego drugiego odbywa się w następujący sposób:

# history -c

Jednak po restarcie maszyny dalej możemy korzystać z zapisanej historii w pliku bash_history. Skasowanie zawartości tego pliku powinno się wykonać w następujący sposób:

# echo > /root/.bash_history

Natomiast skasowanie obydwu: pliku i zapisu sesji:

# echo > /root/.bash_history; history -c

Dzięki temu historia będzie całkowicie pusta.
Następnym razem opiszę użyteczne modyfikacje, które można zastosować do magicznego polecenia bash history
Jeśli znaleźliście w tym wpisie użyteczne informacje, możecie autora nagrodzić „lajkiem” na fecebook’u, lub też jeśli w powyższym teście zauważyliście jakiś błąd – proszę o komentarz.


Podobne Tematy:

  • Piotr Kąkol

    Zamiast „cd !!:$” można było zrobić „cd !:1”, „cd !:$” lub „cd !!$” (1 znak mniej). Fragment „!:” jest bowiem interpretowany jako „!-1:”, czyli poprzednia komenda.
    Ale przydatny artykuł. Nie wiedziałem, że można też wpisywać po „!” nazwy komend (czyli „!mv” odwoła się do ostatniej komendy mv). Dziękuję.
    A da się może odwołać np. do przedostatniego mv?