Plik .bashrc, czyli konfiguracja bash'a

Spis treści

Jakiś czas temu opisywałem konfigurację historii bash'a w pliku .bash_history ale możliwości konfiguracyjne bash'a nie ograniczają się jedynie do zmiany kilku parametrów czy zmiennych dotyczących historii wpisywanych w terminalu poleceń. Ten wpis ma na celu zebranie tych bardziej użytecznych funkcjonalności bash'a, które często są wykorzystywane przez użytkowników linux'a i dopisywane w pliku .bashrc .

Pliki .bash_history, .bash_aliases, .bashrc, .bash_profile i .bash_logout

W katalogu użytkownika mamy kilka plików, które składają się na konfigurację shell'a bash. W pliku .bash_history jest trzymana historia wykonywanych poleceń. Wszystkie parametry dotyczące historii poleceń zostały opisane w osobnym artykule (link we wstępie) i nie będę ich tutaj przytaczał. Dalej mamy do dyspozycji plik .bash_aliases , w którym dla wygody można umieszczać aliasy. By móc korzystać z tego pliku, musimy umieścić ten poniższy kod w pliku konfiguracyjnym bash'a:

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Z kolei plik .bashrc zawiera główną konfigurację. Wszystkie te poniższe opcje będziemy umieszczać w tym właśnie pliku. Dodatkowo, mamy też plik .bash_profile . W nim są tylko te dwa poniższe warunki:

[[ -f ~/.bashrc ]] && . ~/.bashrc
[[ -f ~/.profile ]] && . ~/.profile

Jak widzimy wyżej, najpierw jest ładowana główna konfiguracja bash'a, a po niej jeszcze plik .profle . Jaki jest zatem cel pliku .bash_profile i czy nie możemy korzystać jedynie z .bashrc ? Bash może zostać wywołany interaktywnie lub nieinteraktywnie. Różnica między tymi dwoma sposobami polega na tym, że ten drugi dotyczy głównie sesji logowania, np. na konsoli TTY. Z kolei sesje interaktywne są powiązane z pseudoterminalami, gdzie nie ma potrzeby się logować, np. w środowisku graficznym. Zatem w każdym z tych powyższych przypadków zostanie załadowany plik .bashrc , natomiast w trybie tekstowym (TTY) zostanie także załadowana konfiguracja z pliku .profile . To rozgraniczenie jest bardzo użyteczne ze względu na fakt, że część konfiguracji bash'a może działać znakomicie w środowisku graficznym ale powodować błędy w trybie tekstowym.

Ostatnim plikiem jest .bash_logout , w którym są określone polecenia jakie mają zostać wykonane, gdy w konsoli zostanie wpisane exit lub logout . Ten plik jest ładowany tylko w trybie nieinteraktywnym, głównie na konsolach TTY.

Jako, że wszystkie poniższe opcje będą ustawiane za pomocą shopt , to aktualną konfigurację możemy podejrzeć wpisując w terminalu to właśnie polecenie. Te opcje, które zostaną wpisane do pliku .bashrc , będą mieć efekt permanentny. Dlatego też dobrze jest je pierw przetestować. Wszystkie możliwe opcje są opisane w manualu bash'a.

Sprawdzanie parametrów okna przy wykonywaniu polecenia (checkwinsize)

Często zmieniamy rozmiar okna terminala, a to powoduje zmianę wartości aktualnych wierszy i kolumn, odpowiednio zmiennych $LINES i $COLUMNS . Szereg aplikacji, np. dpkg polegają na tych parametrach. Jeśli zmienimy rozmiar okna, to te dwie powyższe zmienne nie są aktualizowane, wobec czego wyjście takich programów może być lekko nieczytelne. Przy pomocy parametru checkwinsize możemy nakazać bash'owi by aktualizował zmienne $LINES i $COLUMNS przed wywołaniem polecenia. Dopisujemy zatem do pliku .bashrc tę linijkę:

shopt -s checkwinsize

Korekta ścieżek w cd (cdspell)

Bash jest w stanie również poprawiać błędy w nazwach ścieżek przy wywoływaniu polecenia cd , przez co może nam zaoszczędzić nieco czasu. Jak taki mechanizm ma działać? Załóżmy, że chcemy przejść do katalogu /etc/ ale przez przypadek zrobiliśmy literówkę i wpisaliśmy w terminalu cd /ect . Bez korekty, dostalibyśmy błąd, natomiast po aktywowaniu tej opcji, bash nas powiadomi o fakcie dokonania poprawki i przejdzie do katalogu /etc/ . My zaś nie będziemy musieli ponownie wprowadzać polecenia cd i poprawiać błędu. By aktywować tę funkcję bash'a, dodajemy do pliku .bashrc tę poniższą linijkę:

shopt -s cdspell

Przejściowe zmienne (cdable_vars)

Ścieżki do katalogów mogą być naprawdę długie, a przechodzenie do nich (nawet z uzupełnianiem przy pomocy klawisza TAB ) powolne. Każdą z tych długich ścieżek możemy zamknąć w zmiennej. Problem w tym, że gdy wydamy polecenie cd $zmienna , to nie znajdziemy się w katalogu, który pod tą zmienną się znajduje. Możemy jednak zmienić to zachowanie bash'a i dopisać w pliku .bashrc parametr cdable_vars :

shopt -s cdable_vars

Trzeba mieć jednak na uwadze, że znak ~ , który symbolizuje katalog domowy użytkowników, nie zadziała z tą opcją i trzeba precyzować pełne ścieżki, tj. zaczynając od /home/morfik/ .

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.