Uwaga! Długie!

Ten tekst jest dość długi, więc jeżeli tylko chcesz zobaczyć, jakich komend użyć to zajrzyj tutaj. A jeśli chcesz wiedzieć coś więcej, to czytaj dalej...
Na końcu tekstu znajdują się Często Zadawane Pytania: jeśli w tekście coś jest niejasne, to spróbuj zajrzeć tam.


Informacje Ogólne

Ten dokument omawia pokrótce możliwości zmian w systemie, które może porobić każdy użytkownik, nawet nie mający żadnych dodatkowych uprawnień. Chodzi o tzw. ustawienia środowiskowe, ułatwiające pracę z danym systemem. Np. istnieje możliwość definiowania własnych poleceń, zmiana kolorów wyświetlania, uruchamianych przy logowaniu poleceń itp. Po kolei postaram się opisać kilka podstawowych sposobów służacych dostosowaniu Linuxowego/Unixowego konta do indywidualnych potrzeb użytkownika.
Opisane metody dotyczą przede wszystkim shella zwanego BASH (Bourne Again SHell), w tej chwili chyba najbardziej popularnego (może dlatego, że niewiele osób używających Linuxa wie jak zmienić domyślnie ustawionego BASHa na coś innego...). Jeżeli będzie taka potrzeba, to napiszę też jak porobić analogiczne zmiany w innych shellach, np. w TCSH. Jak ktoś chce, to prosze mailować...

Od czego zacząć?

Wszystkie niżej opisane zmiany dotyczą w praktyce dwóch plików: .bashrc oraz .bash_profile . Oba znajdują się w domowym katalogu użytkownika. Czym się różnią? Zaraz do tego dojdę. Tymczasem jeszcze tylko taka informacja: oprócz tych plików dodatkowo w katalogu /etc znajdują się dwa pliki: bashrc (bez kropki na początku) oraz profile. Są to odpowiedniki tych dwóch plików z domowego katalogu, które czasem są "uruchamiane" przez system przed przeczytaniem naszych lokalnych .bashrc i .bash_profile, a czasem, np. jeżeli w katalogu domowym nie ma tych plików, to zamiast nich.
Oto krótki opis obu plików:


Warto używać obu plików zamiast tylko jednego (a właśnie większość użytkowników używa tylko jednego - na ogół .bash_profile). Dlaczego? Załóżmy, że chcemy zdefiniować swoje własne polecenie, a oprócz tego chcemy żeby przy logowaniu wyskakiwał, dajmy na to, terminarz z rozkładem zajęć. Jeśli chcieć to nagrać tylko do jednego pliku, to jeżeli tym plikiem będzie .bash_profile, to wtedy przy każdym nowo otwartym okienku w XWindow polecenie, ktore zdefiniowaliśmy w .bash_profile, nie będzie widoczne - bo .bash_profile jest uruchamiany tylko przy logowaniu. Natomiast jeżeli wrzucić wszystko tylko do .bashrc, to wtedy rzeczywiście, polecenie będzie działało, ale za to każde nowo otwarte okienko będzie na początku pokazywało terminarz - co już po kilku otwarciach/zamknięciach okien zaczyna być denerwujące. Dlatego najrozsądniej jest programy uruchamiane przy starcie wrzucić do .bash_profile, a definicje własnych poleceń, ustawienia zmiennych itp. do .bashrc

Programy Uruchamiane przy Logowaniu

To jest najprostsze: po prostu wystarczy dopisać polecenia którymi uruchamia się dany program na końcu pliku .bash_profile. I już - to wystarcza. Ważne jest, żeby system wiedział, gdzie ma tych programów szukać, więc na wszelki wypadek lepiej podawać polecenia razem z całą ścieżką dostępu: czyli np. zamiast "pine" napisać "/usr/bin/pine".

Definiowanie Własnych Poleceń (aliasów)

Na początku pokażę, jak definiuje się aliasy z linii komend. Składnia jest prosta:

alias 'polecenie'='inne_polecenie_lub_kilka_polecen'

Czyli np. jeśli chcemy zamiast wpisywać "netscape" pisać tylko "n", to wystarczy wykonać:

alias 'n'='netscape'

Proste? Można też dawać bardziej złożone polecenia, np.:

alias 'ls'='ls --color'

Dzięki temu od tej pory po wpisaniu "ls" komputer wykona nie zwykłe polecenie ls, ale "ls" z opcja "--color" - co powoduje, że nazwy katalogów są wyświetlane innym kolorem, programów innym, reszty plików jeszcze innym. Można pisać jeszcze bardziej skomplikowane aliasy (złożone z kilku poleceń):

alias 'cogdziekiedy'='date ; cal ; echo $USER@$HOST'

Taki alias wyświetli datę, godzinę, i pokaże kim jesteśmy i na jakim komputerze jesteśmy zalogowani. Jak widać, tworzenie aliasów nie jest trudne.
Co zrobić, żeby aliasy nie znikały po wylogowaniu? Też proste - dopisać definicje aliasów (tak jak powyżej) na końcu pliku .bashrc. Dzięki temu przy każdym wywołaniu shella (przy logowaniu, uruchamianiu xterma) aliasy będą na nowo definiowane.

Zmienne Globalne i Lokalne

Co to są zmienne, chyba nie trzeba tłumaczyć. W Linuxie zmienne odpowiadają za różne rzeczy - np. za to jaki edytor jest domyślnie używany, albo gdzie komputer ma szukać programów, albo jak ma wyglądać pole nadawcy wychodzących listów.
W samym systemie z grubsza rzecz biorąc są dwa rodzaje zmiennych - globalne i lokalne. Zmienne lokalne są widoczne tylko dla tego shella, w którym zostały ustawione. Tzn. jeśli na konsoli ustawimy jakąś zmienną, to po uruchomieniu XWindow shelle w nim wywołane nie będą miały dostępu do wartości tej zmiennej. Inaczej jest ze zmiennymi globalnymi - zmienne ustawione globalnie są widoczne w każdym "podshellu".
Jak zdefiniować jakąś zmienną? Wystarczy:

zmienna=wartosc

I już. Od tej pory w tym shellu możemy używać tej zmiennej, ale tylko w nim, bo taka deklaracja jest deklaracją lokalną. Natomiast żeby zmienić stan zmiennej (z lokalnej na globalną) trzeba wklepać:

export zmienna

Można też od razu napisać:

export zmienna=wartość

Jak odczytać zawartość zmiennej? Wystarczy użyć wyrażenia "$zmienna", np. "$USER" oznacza "zawartość zmiennej USER".
Dobrym przykładem tu może być ustawianie zawartości pola From w wysyłanych e-mailach. Ustawia się to następująco:

MAILNAME="Sebastian Zagrodzki"
MAILUSER="s.zagrodzki"
MAILHOST="sith.mimuw.edu.pl"
export MAILUSER MAILHOST MAILNAME

Wywołanie powyższych poleceń w głównym shellu (przy logowaniu) gwarantuje, że wszystkie programy, które teraz będą wywołane, będą widziały te ustawienia.
Innym przykładem ważnej zmiennej jest zmienna "PATH", która zawiera listę katalogów, w których system będzie szukał wpisywanych poleceń. Załóżmy, że w katalogu "aaaa" mamy program o nazwie "test". Co trzeba zrobić, żeby go uruchomić? Teoretycznie powinna wystarczyć nazwa. Jednak po wpisaniu "test" komputer może odpowiedzieć: command not found. To znaczy, że przejrzał wszystkie katalogi z tych opisanych w ścieżce, i nie znalazł w nich programu o nazwie "test".
Standardowa ścieżka wygląda tak: /bin:/usr/bin:/usr/local/bin . Co zrobić, żeby dodać do niej jakiś inny katalog? Łatwo.

PATH=$PATH:moj_katalog1:moj_katalog2:moj_katalog3

To doda do ścieżki katalogi moj_katalog1, 2 i 3. Trzeba pamiętać, żeby wyeksportować zmienną PATH, jeśli wcześniej jeszcze nie była. Raz wyeksportowana zmienna cały czas jest globalna i można ją modyfikować tak jak lokalną.
Uwaga: w ścieżce warto mieć swój katalog domowy (" ~ "), swój katalog z własnymi programami oraz katalog bieżący (" . "). Popatrz na przykłady plików na końcu tekstu.
Jak wstawić takie deklaracje do plików startowych? Tak jak zawsze: trzeba je dopisać na końcu pliku: zmienne lokalne w .bashrc, a globalne wystarczy w .bash_profile (ale w ostateczności można też w .bashrc).

Odnośniki Do Plików (linki)

Co to są linki do plików? Są to takie niby-pliki, które naprawde składają się tylko z nazwy (swojej) oraz informacji o tym, gdzie znajduje się jakiś plik. Kiedy system chce się odwołać do tego pliku, to sprytnie sam sobie sprawdzi na co ten plik pokazuje i odwoła się właśnie do tego wskazywanego miejsca. Przypomina to bardzo filozofię Windowsowych "skrótów".
Do czego to się może przydać? Prosty przykład: załóżmy, że u kolegi w katalogu domowym jest jakiś ciekawy program którego chcielbyśmy używać. Jak to zrobić? Można na przyklad za każdym razem wpisywać komendę katalog/mojego/kolegi/jakis_program - nie jest to bardzo wygodne. Można tez skopiować ten program do swojego katalogu - ale wtedy tracimy cenne miejsce na dysku. Rozwiązaniem optymalnym są właśnie linki: po utworzeniu w swoim katalogu takiego "skrótu" wskazującego do pliku gdzieś indziej, będziemy mogli używać programu tak, jakby był skopiowany do naszego katalogu, ale za to taki odnośnik zajmuje bardzo mało miejsca.
Są dwa rodzaje takich linków: linki twarde (ang. hard link) oraz symboliczne. Nie będę wnikał na czym polegają różnice między nimi. Wystarczy kierować się prostą zasadą używania linków twardych do plików, a linków symbolicznych do katalogów (bo w ten sam sposób można robić "skróty" do katalogów!).
Jak się tworzy linki? Służy do tego polecenie "ln". Przykład:

ln ~janek/programy/fajny_program ~/program_janka

Takie polecenie spowoduje utworzenie w naszym katalogu domowym pliku/linka o nazwie "program_janka", który wskazuje na plik fajny_program w katalogu domowym użytkownika "janek". Taki link jest linkiem twardym. Inny przykład:

ln -s ~janek/jakas/bardzo/dluga/sciezka/ ~/katalog_janka

Takie coś utworzy w naszym katalogu domowym katalog/link o nazwie "katalog_janka" ktory w rzeczywistości będzie tym samym co katalog_o_długiej_ścieżce w katalogu domowym "janka".
Aha, ważna rzecz: kasowanie linków nie powoduje kasowania plików lub katalogów do których on się odnoszą! Tu powiem tez o roznicy miedzy linkiem symobolicznym do pliku, a linkiem twardym. Kiedy po utworzeniu linka twardego skasujemy to, do czego sie on odnosil, to plik dalej pozostanie na dysku, jako wlasnie ten link (ktory od tej pory jest byc moze jedyna kopia danego pliku). Po prostu dodanie linka twardego zwiekasz "licznik kopii pliku" w systemie. Kiedy kasujemy plik/link twardy, komputer po prostu zmniejsza ten licznik o jeden, a kiedy licznik jest 0, dopiero usuwa plik fizycznie z dysku. Przy linkach twardych komputer nie widzi roznicy miedzy plikiem oryginalnym a linkiem do niego. Inaczej jest z symbolicznymi - jesli po utworzeniu linka symbolicznego skasujemy plik, do ktorego sie odnosil, to dane tracimy bezpowrotnie - link jest tylko wskaznikiem i od tej pory pokazuje na nieistniejacy plik.
Raz utworzone linki zostają na dysku na stałe, więc nie ma potrzeby dopisywania informacji o nich do żadnego pliku.

Skąd Wziąć Inne Informacje?

Polecam instrukcję do BASHa ("man bash") - tam jest opisane wszystko to, co ja tu w skrócie (?) przedstawiłem. Zwłaszcza warto obejrzeć rozdział poświęcony zmiennej "PROMPT" - ona odpowiada za wygląd znaku zachęty (to, co zawsze pokazuje się w linii komend po lewej stronie...)

Przykłady Plików Startowych

-------------------- .bashrc --------------------
# .bashrc

# User specific aliases and functions

# Source global definitions 	{ to wszystko jest żywcem przepisane z
				domyślnego pliku .bashrc }
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Aliasy
alias 'q'='logout'
alias 'ls'='ls --color -F'
alias 'll'='ls --color -lF'
alias 'la'='ls --color -aF'
alias 'x'='startx'
alias '..'='cd ..'
alias '-'='cd -'
alias 'z'='telnet sith.mimuw.edu.pl'

-------------------- koniec .bashrc ---------------------

-------------------- .bash_profile ----------------------

# .bash_profile

# Get the aliases and functions	{jak wyżej - żywcem z domyślnych plików}
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

# Znak ~ to to samo co $HOME (oznacza ścieżkę do katalogu domowego)

PATH=$PATH:$HOME:$HOME/bin:.
BASH_ENV=$HOME/.bashrc
MAILUSER="s.zagrodzki"
MAILNAME="Sebastian Zagrodzki"
MAILHOST="sith.mimuw.edu.pl"
export BASH_ENV PATH MAILUSER MAILHOST MAILNAME

# Programy uruchamiane na starcie
clear
date

------------------- koniec .bash_profile ----------------------

Często Zadawane Pytania

1. Co zrobić, jeśli nie mam plików startowych w katalogu domowym?

Przede wszystkim upewnij się, że rzeczywiście ich nie ma. Spróbuj obejrzeć zawartość katalogu poleceniem "ls -a". Jeżeli rzeczywiście ich tam nie znajdziesz, to wtedy najlepiej chyba je skopiować z katalogu /etc/skel (w tym katalogu system trzyma pliki, które są nagrywane na każde nowo utworzone konto...). Napisz: "cp /etc/skel/.bashrc /etc/skel/.bash_profile ~". Powinno pomóc...

2. Zmieniłem oba pliki, ale moje ustawienia nie działają...

Żeby nowe ustawienia zadziałały, musisz jeszcze raz uruchomić oba pliki - na przykład wylogowując się i logując jeszcze raz, albo pisząc "bash ~/.bash_profile".

3. Mam dwa konta. Czy wystarczy, jeżeli poprawię pliki tylko na jednym z nich?

Oczywiście nie. Zmiany na jednym koncie dotyczą tylko tego konta i nie będą w żaden sposób widoczne na innych... Przynajmniej najczęściej tak jest.


Powrót do strony głównej