Skrypty shella programowanie w języku powłoki. Zacznijmy od przypomnienia. Shell, czyli powłoka, to program przeznaczony do prowadzenia interakcji z użytkownikiem. Innymi słowy jest to narzędzie, dzięki któremu użytkownik może wykonywać pewne operacje, korzystając z dostarczanego przez powłokę języka. Działanie powłoki oczywiście jest możliwe dzięki funkcjom dostarczanym przez jądro systemu operacyjnego 1. Shell odbiera od użytkownika polecenia do wykonania - w większości w trybie tekstowym. Polecenia te powinny należeć do zestawu rozkazów rozumianych przez powłokę ( język powłoki ) nazywamy je wówczas poleceniami wewnętrznymi (lub wbudowanymi). Przykładowo polecenie for jest elementem wbudowanym shella. Do jego zrozumienia (i prawidłowej interpretacji) powłoka nie potrzebuje żadnej pomocy ani programów zewnętrznych. W przypadku, gdy wprowadzone polecenie nie jest rozpoznane jako polecenie wbudowane, powłoka uznaje je za program zewnętrzny, który należy wykonać (dlatego mówimy czasem o poleceniach zewnętrznych shella). Istnieją wówczas dwie możliwości albo taki program jest programem wykonywalnym (czyli skompilowaną wersją programu źródłowego), albo jest zwykłym plikiem tekstowym, zawierającym skrypt. Skrypt to oczywiście nic innego jak zbiór poleceń (wewnętrznych lub zewnętrznych). Oczywiście, jeśli shell nie znajduje programu o podanej nazwie, to zgłasza użytkownikowi błąd. W ten sposób, można podać schemat interpretacji każdego polecenia wprowadzonego do shella (nie jest to może poprawny formalnie schemat blokowy, ale wystarczająco dobra ilustracja działania shella) por. rysunek obok 1 Jak dalej zobaczymy, shell potrafi także korzystać z innych programów ale one też działają dzięki usługom shella
W tym miejscu warto przypomnieć, że w systemach linuksowych zwykle użytkownik ma do wyboru jedną z wielu równorzędnych powłok. Przykładowe możliwości to: sh, bsh, csh, ksh, bash i zsh. Przypomnijmy raz jeszcze rysunek zamieszczony poprzednio. Użytkownik wydaje polecenie shellowi zostanie on albo rozpoznany jako polecenie wewnętrzne, albo nastąpi próba uruchomienia programu zewnętrznego. Nawiasem mówiąc, pojęcie shella można także skojarzyć ze starymi (naprawdę starymi!) grami tzw. text adventure. Poniższe dwa ekrany pokazują możliwości kultowej (w swoim czasie) gry The Hobbit, wydanej na ośmiobitowy komputer ZX Spectrum w 1982 roku (ćwierć wieku temu!). Z uwagi na bardzo ograniczone możliwości sprzętowe, program raczej opisywał niż pokazywał graczowi otaczającą go scenę. W takich warunkach trudno było o stworzenie wygodnego (wg dzisiejszych standardów) interfejsu użytkownika. W związku z tym gracz musiał korzystać z ograniczonego zestawu poleceń, wpisywanych z konsoli (np. TAKE, ATTACK, LOOK, GO, SAY itp.). Przykładowo, można było wykonać taką sekwencję: TAKE RING (weź pierścień) WEAR RING (załóż pierścień) DRAW SWORD (wyciągnij miecz) ATTACK ORC WITH SWORD (zaatakuj orka mieczem)
W niektórych grach (późniejszych), można było budować całe zestawy poleceń i odpalać je jednym rozkazem. Wyglądało to mniej więcej tak: ALIAS FIGHT = DRAW SWORD; DRINK MAGIC POTION; ATTACK NEAREST Wówczas, w sytuacji zagrożenia, nie trzeba było wywoływać długiej linii wystarczyło wpisać FIGHT co powodowało uruchomienie sekwencji poleceń. Dziś podobne skróty dostępne są w niektórych grach sieciowych. Jak łatwo zauważyć, ten rodzaj interakcji występuje także w linuksowym shellu. Można wydawać pojedyncze polecenia (takie jak TAKE RING w grze Hobbit), albo przygotowywać grupy poleceń (ALIAS FIGHT). Te ostatnie nazywamy po prostu skryptami. Po tym, nieco teoretycznym wstępie, spróbujmy napisać pierwsze polecenia shella. Spróbujmy działać na razie w trybie interaktywnym, to znaczy wydawać shellowi pojedyncze polecenia. echo "Hello world" Polecenie echo powoduje wyświetlenie podanego dalej tekstu na ekranie. Jeśli chcemy uzyskać na temat tego polecenia więcej informacji, możemy skorzystać z systemowego helpa jest on dostępny dzięki poleceniu man (manual). Pierwszych kilka linii pokazującego się helpa pokazano niżej: man echo ECHO(1) User Commands ECHO(1) NAME echo - display a line of text SYNOPSIS echo [OPTION]... [STRING]... DESCRIPTION Echo the STRING(s) to standard output. -n do not output the trailing newline -e enable interpretation of backslash escapes -E disable interpretation of backslash escapes (default) --help display this help and exit Manual zwykle dzieli się na sekcje NAME (nazwa i krótki opis polecenia), SYNOPSIS (sposób wywoływania) i DESCRIPTION (szczegółowe informacje na temat parametrów). Warto nauczyć
się czytać te informacje dzięki niemu zawsze będzie można uzyskać pomoc na temat mniej znanych poleceń. Zauważmy też pewien standard zapisu, używany w sekcji SYNOPSIS: cos oznacza konieczność pojawienia się obiektu coś [cos] oznacza, że coś może (ale nie musi wystąpić) cos1 cos2 - oznacza alternatywę: musi wystąpić cos1 lub cos2 cos1 cos2] oznacza alternatywę: może wystąpić cos1 lub cos2 Możemy także skorzystać z polecenia help, które podaje polecenia wbudowane aktualnie użytkowanego shella: help GNU bash, version 3.2.39(1)-release (i386-redhat-linux-gnu) These shell commands are defined internally. Type `help' to see this list. Type `help name' to find out more about the function `name'. Use `info bash' to find out more about the shell in general. Use `man -k' or `info' to find out more about commands not in this list. A star (*) next to a name means that the command is disabled. JOB_SPEC [&] (( expression )). filename [arguments] : [ arg... ] [[ expression ]] alias [-p] [name[=value]... ] bg [job_spec...] bind [-lpvspvs] [-m keymap] [-f fi break [n] builtin [shell-builtin [arg...]] caller [EXPR] Podamy teraz kilkanaście najważniejszych poleceń, których będziemy używali do pisania skryptów. Dla każdego z nich warto zobaczyć jego manual, aby zorientować się w możliwościach ich wykorzystania (różne opcje zwane też przełącznikami) ls pokazuje zawartość wskazanego katalogu ls l pokazuje długą formę (więcej informacji o plikach) ls a pokazuje także pliki ukryte
dir pwd cd mkdir rmdir cp rm mv ps kill man zip gzip tar chmod chown finger who whoami passwd du df działa jak ls bez parametrów pokazuje bieżący katalog (ten, w którym pracujemy) zmiana katalogu cd xxx zmienia katalog na xxx cd.. zmienia katalog na nadrzędny cd zmienia katalog na katalog domowy stworzenie katalogu usunięcie katalogu skopiowanie pliku cp xxx yyy kopiuje plik xxx do pliku yyy cp R /home/pjwstk/wojmos/skrypty. kopiuje podany katalog i pliki w nim usunięcie pliku przenosi plik pokazuje procesy aktualnie działające w systemie ps aux pokazuje wszystkie procesy wszystkich użytkowników wysyła sygnał do procesu (najczęściej sygnał zabicia) kill -9 8888 zabicie procesu o numerze 8888 (wysłanie sygnału zabicia; 9) manual, czyli pomoc systemowa program do archiwizacji program do archiwizacji dostępny na licencji GNU użyteczny do dziś w archiwizacji program, wywodzący się z dawnych nośników taśmowych służy do umieszczania wielu plików w postaci jednego archiwum ustawia prawa dostępu do pliku zmienia właściciela pliku pokazuje dane użytkownika (program często wycofywany i blokowany z uwagi na wymogi bezpieczeństwa) pokazuje zalogowanych użytkowników pokazuje nazwę zalogowanego użytkownika zmienia hasło (użytkownik root może zmienić hasło dowolnego użytkownika) pokazuje użycie dysku lub katalogu du sh xxx pokazuje ile miejsca zajmuje katalog xxx pokazuje ilość wolnego miejsca dostępnego na dysku
touch grep wc cat diff find head tail nano df h /dev/sda1 pokazuje ile wolnego miejsca zostało na dysku /dev/sda1 tworzy pusty plik touch zzz tworzy pusty plik o nazwie zzz filtr służący m.in. do przepuszczania linii zawierających podany wzór cat /etc/passwd grep wojmos czy w pliku jest linia zawierajaca słowo wojmos potrafi zliczać linie, słowa i bajty wc-l xxx podaje ile linii ma plik xxx proste polecenie o zadziwiająco wielkich możliwościach. Pozwala ono na przeniesienie tego, co dostaje na wejściu na wyjście. Często używane w połączeniach poleceń z użyciem > lub cat xxx wczytuje plik xxx i wysyła go na ekran cat <xxx wczytuje plik xxx i wysyła go na ekran cat xxx > yyy wczytuje plik xxx i kopiuje go do pliku yyy cat > yyy pozwala wprowadzać z klawiatury dane do pliku yyy porównuje pliki diff xxx yyy porównuje zawartość plików xxx i yyy wyszukuje pliki find /home -name *.jpg print wyszukuje wszystkie jpgi w katalogach użytkowników Wyświetla pierwsze linie pliku head n10 /var/log/messages pokazuje 10 pierwszych linii logu systemowego Wyświetla ostatnie linie pliku tail n10 /var/log/messages pokazuje 10 ostatnich linii logu systemowego Przyjazny edytor tekstowy dla linuxa, następca programu pico