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.