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.
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ć...
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:
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".
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.
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).
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.
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...)
-------------------- .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 ----------------------