Bash history – opcje zaawansowane

Jako, że koniec świata niefortunnie nas ominął, trzeba opublikować kolejne dzieło. Pisaliśmy niedawno o pierwszym rendez-vous z Linuksem, a jeszcze wcześniej pisaliśmy o podstawowych (i tych mniej podstawowych) funkcjach bash history. Dziś słowo o bardziej zaawansowanych opcjach bash history, czyli jak pomijać duplikaty oraz jak wyświetlać datę i godzinę wykonania poszczególnej komendy. Krótko mówiąc dziś to my zapanujemy nad bash history ;). Najpierw sprawdzimy jakie mamy ustawione zmienne systemowe dotyczące naszej historii poleceń:

set | grep HIST
HISTFILE=/root/.bash_history
HISTFILESIZE=500
HISTSIZE=500

Poznalismy właśnie lokalizację naszego pliku .bash_history oraz dwie właściwości wielkość pliku HISTFILESIZE (czyli ile komend będzie zachowanych w pliku) oraz wielkość samej historii HISTSIZE (czyli ile komend zostanie zapamiętanych w danej sesji) jako że nie są to zbyt obciążające „zmienne” proponujemy ustawić wartość nieco większą – wedle uznania :).

Usuwanie niechcianych i zduplikowanych wpisów

Domyślnie w historii poleceń zapisywane są wszystkie wykonane komendy. Jednak często zachodzi potrzeba ukrycia pewnych komend (np. cd, ps, albo pwd) lub pozbycia się duplikatów.
Weźmy przykład:

pwd
pwd
pwd
history
    1  pwd
    2  nano
    3  set | grep HIST
    4  nano /etc/exports
    5  ps aux
    6  pwd
    7  pwd
    8  pwd
    9  history

Widać tutaj, że 3-krotne użycie pwd, jest zapisane 3 razy w historii. Nie jest to zbyt eleganckie 😉 więc pozbądźmy się tych duplikatów.

export HISTCONTROL=ignoredups

dla sprawdzenia:

set | grep HIST
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=500
HISTSIZE=500

Sprawdźmy czy duplikaty nie będą zapisywane w bash history:

pwd
/
pwd
/
pwd
/
history
    1  pwd
    2  pwd
    3  history
    4  export HISTCONTROL=ignoredups
    5  set | grep HIST
    6  pwd
    7  history

Jak widać duplikaty poleceń nie są już dalej zapisywane.

Dodanie znacznika daty i godziny w bash history

Nierzadko potrzebujemy dokładnej informacji o tym kiedy dana komenda została wykonana (np. żeby porównać z błędami w logach aplikacji lub systemowych). Oczywiście Linuksa możemy konfigurować „do woli” , więc i na taki problem znajdzie się prosty trick 🙂

export HISTTIMEFORMAT='%F %T '
history | more
186  2013-01-03 21:26:40 export HISTTIMEFORMAT='%F %T '
187  2013-01-03 21:26:43 history
188  2013-01-03 21:26:52 history | more

Oczywiście format ten można jeszcze modyfikować 😉

Synchronizowanie bash history pomiędzy sesjami

W codziennej pracy z Linuksami ta sztuczka przydaje mi się najbardziej. Często mam owartych kilka sesji ssh do jednej maszyny, lub też otwartych kilka terminali podczas pracy z fizycznym dostępem do serwera. Domyślnie historia „zapisywana” jest dla każdej sesji a dopiero po wylogowaniu się jest zapisywana (lub nie) do wspólnego pliku .bash_history dla danego użytkownika. Jednak dostęp do tej samej historii poleceń z wielu sesji jest bardzo przydatny. Dzięki poniższym komendom zsynchronizujemy sobie wszystkie sesje (a właściwie historię poleceń)

shopt -s histappend
PROMPT_COMMAND="history -n; history -a"
Pomijanie komend

Jeśli należycie do grona purystów i lubicie porządek te opcje z pewnością przypadną wam do gustu. Nie od dziś wiadomo, że w historii poleceń warto „przechowywać” te najistotniejsze, a te które są z natury banalne jak np ls, czy whoami można śmiało pominąć. Mamy dwie możliwości na skorzystanie z tego tricku, pierwsza opcja to wykluczenie konkretnych komend:

export HISTIGNORE="pwd:ls:whoami:top:history:"

Dzięki tej opcji w bash history nie zobaczymy poleceń pwd, ls, whoami, top, history
Druga opcja to pominięcie komend poprzedzonych spacją.

export HISTCONTROL=ignorespace

Dzięki tej opcji zaś w historii nie zostanie zapisana żadna komenda, która jest poprzedzona spacją:

ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
 ping www.wp.pl
PING www.wp.pl (212.77.100.101) 56(84) bytes of data.
history | tail -3
  192  2013-01-03 23:48:30 history | tail -2
  193  2013-01-03 23:49:11 ping 8.8.8.8
  194  2013-01-03 23:49:29 history | tail -3
Podmiana wyrazów

Wyobraźmy sobie, że wklepaliśmy właśnie w bashu epicko długie polecenie, a tu po pacnięciu w enter – błąd, literówka :), oczywiście można strzałką w górę wywołać ostatnie polecenie i po prostu poprawić literówkę. Poniżej przykład jak odwołując się do ostatniego polecenia można poprawić literówkę, lub inny błąd.

ls /hmoe/ftp
/bin/ls: cannot access /hmoe/ftp: No such file or directory
^hmoe^home^
ls /home/ftp

Opisane wyżej tricki pomagają opanować bash history i są mniej lub bardziej pomocne w codziennej pracy. Mam nadzieję, że przydadzą się adeptom nie tak znowu trudnej sztuki codziennego zarządzania Linuksami.

Piotr Berent

Piotr Berent od 2002 w pocie czoła pracujący w środowisku IT, obecnie freelancer - Inżynier Systemowy. Entuzjasta wirtualizacji, automatyzacji i rozwiązań opartych o narzędzia open-source.

Przeczytaj także...

Dodaj komentarz