Powłoka (shell)
3.1
Charakterystyka ogólna
Po zarejestrowaniu się w systemie użytkownik ma dostęp do systemu poprzez interpretator poleceń zwany powłoką (ang. shell). Z tego poziomu może uruchamiać programy aplikacyjne bądź ogólnie dostępne programy systemowe.
Powłoka w systemie UNIX zapewnia komunikację miedzy użytkownikiem a systemem. Jest ona w stosunku do jądra systemu zwykłą aplikacją, często dopasowywaną do indywidualnych potrzeb i preferencji użytkownika.
W działającym systemie zazwyczaj dostępnych jest kilka różnych powłok, np. Bourne Shell —
sh, Berkeley C Shell — csh, czy bardzo ostatnio popularny Bourne Again Shell — bash. Różnice miedzy nimi polegają głównie na sposobie programowania w języku powłoki, różnią się również możliwościami oferowanych usług i udogodnień związanych z pracą w systemie.
Powłoka jest inicjowana automatycznie po zarejestrowaniu się użytkownika w systemie. Skoro jest to zwykła aplikacja, to jej nowy egzemplarz można uruchomić w dowolnej chwili poleceniem np. sh.
Powłoka przyjmuje polecenie od użytkownika, dekoduje je i przekazuje do jądra w celu wykonania. Pracę powłoki można przedstawić algorytmicznie jako ciąg następujących czynności: 1. wysłanie znaku gotowości na terminal (zazwyczaj: $, % lub #); 2. przyjęcie polecenia od użytkownika;
3. zdekodowanie polecenia, odszukanie w katalogach odpowiadającego mu programu; 4. przekazanie polecenia do jądra, w celu uruchomienia odpowiedniego procesu (lub procesów) realizującego polecenie i oczekiwanie na jego zakończenie; 28 października 2001 roku— wersja 0.2
38
5. przyjęcie odpowiedzi od jądra i przekazanie tych wyników użytkownikowi, powrót do punk-tu pierwszego .
Czynności te wykonywane są w pętli aż do napotkania polecenia kończącego działanie powłoki lub odebrania znaku Ctrl-D, oznaczającego koniec pliku (wejściowego).
W niniejszej pracy skoncentrowano się głównie na shellu Bourne’a, ponieważ jest to powłoka najczęściej spotykana, część przykładów podano również dla bash’a, gdyż jest to w tej chwili chyba najwygodniejsza powłoka.
3.2
Programowanie w języku powłoki
Powłoka umożliwia konstrukcję bardziej złożonych struktur programowych niż podane we wcze-
śniejszym rozdziale. Są to:
operowanie zmiennymi;
tworzenie procedur powłoki (tzw. skryptów );
używanie struktur sterujących;
wykorzystywanie poleceń wewnętrznych.
Tworzenie procedur powłoki, używanie struktur sterujących oraz wykorzystywanie poleceń we-wnętrznych opisano szczegółowo w rozdziale ?? .
3.2.1
Grupowanie poleceń
Polecenia można zagnieżdżać za pomocą nawiasów okrągłych () lub grupować w nawiasach
klamrowych
.
Nawiasy okrągłe służą do grupowania poleceń, które będą wykonywane jako samodzielny proces, np. proces wykonywany w tle, wówczas znak & lub przeadresowujące wejście/wyjście są obowiązujące dla całej grupy poleceń. Stan końcowy ( exit status) jest wynikiem powstałym po wykonaniu ostatniego polecenia.
Nawiasy klamrowe służą do grupowania poleceń wykonywanych w shellu bieżącym. Znaki traktowane są przez powłokę jak polecenia, tzn. po nich koniecznie musi wystąpić znak spacji, a ostatnie polecenie w klamrach musi zostać zakończone średnikiem. Nawiasy klamrowe mogą również służyć do oddzielenia zmiennej od innych znaków.
Przykład 3.2.1
Poniższa sekwencja poleceń spowoduje wyświetlenie napisu: To jest test.
28 października 2001 roku— wersja 0.2
39
echo "$ a test"
Ciąg poleceń zawarty w nawiasach okrągłych jest wykonywany jako samodzielny, podrzędny proces powłoki. Zmiany w otoczeniu powstałe w tym procesie nie będą więc oddziaływały na aktualny proces powłoki. Natomiast polecenia zawarte w nawiasach klamrowych wykonywany
jest w aktualnym shellu. Efekty powstałe poprzez zastosowanie nawiasów () i przedstawia
przykład ?? .
Przykład 3.2.2
$ pwd
/home/students
$ (cd /bin ; ls mkdir)
mkdir
$ pwd
/home/students
$
cd /bin ; ls mkdir;
mkdir
$ pwd
/bin
3.2.2
Zmienne powłoki
Nazwy zmiennych stanowią ciągi znaków zaczynające się od litery i mogą składać się z liter, cyfr i znaków podkreślenia (_). Nazwy zmiennych muszą zawierać co najmniej jeden znak. Przypisa-nie wartości zmiennej wykonuje się w następujący sposób:
zmienna = wartość
Domyślnym typem zmiennych jest typ napisowy i w zasadzie nie używa się innych typów do określenia zmiennych. Dodatkowo shell bash oferuje komendę typset, za pomocą której można deklarować typ zmiennej. Oto wybrane możliwości tej komendy:
-i - typ integer;
-u - wielkie litery;
-l - małe litery;
-x - zmienna eksportowalna;
28 października 2001 roku— wersja 0.2
40
Przykład 3.2.3
Przykłady przypisania wartości zmiennym:
$ os=LINUX
$ sys=586
$ user=‘who am i‘
dodatkowo w bash:
$ typeset -i sys=586
$ typeset -u os=Linux
$ typeset +u os
Aby odwołać się do wartości zmiennej należy poprzedzić ją znakiem $.
Do wyświetlania wartości zmiennych globalnych służy polecenie env, natomiast do wyświetlenia zmiennych lokalnych służy polecenie set. Poleceniem echo można wyświetlić wartości pojedyn-czych zmiennych.
Dodatkowo bash oferuje do wyświetlania zawartości zmiennych polecenie print, a do podsta-wienia wyniku polecenia jako wartości zmiennej oferuje konstrukcję: $( polecenie ).
Przykład 3.2.4
$ os=LINUX
$ sys=586
$ echo $os na $sys
LINUX na 586
$ print $os
LINUX
Przykład 3.2.5
Ustawianie ścieżki przeszukiwań dla użytkownika zgłaszającego się do systemu. Inna ścieżka przypisana będzie użytkownikowi root, a inna pozostałym użytkownikom systemu.
if [ "$USER" != "root" ]; then
PATH=$HOME/bin:$PATH
else
PATH=/etc:/usr/etc:$PATH
fi
28 października 2001 roku— wersja 0.2
41
Powłoka posiada szereg zmiennych o wartościach zdefiniowanych pierwotnie (predefiniowanych).
Należą do nich między innymi zmienne PS1 i PS2 (monity systemowe), HOME (nazwa katalogu osobistego), PATH (zbiór katalogów przeszukiwanych przez system operacyjny w celu znalezienia programów) i wiele innych. Wartość tych zmiennych może być zmieniana przez użytkownika.
Jeśli pewne zmienne są używane w każdej sesji użytkownika, najwygodniej zapisać je w pliku
.profile, który powinien znajdować się w katalogu osobistym użytkownika. Plik ten definiuje prywatne środowisko użytkownika, a jest wykonywany zawsze w momencie uruchomienia sesji.
Plik ten może zawierać oprócz definicji zmiennych również polecenia, które będą wykonywane zawsze po zarejestrowaniu się użytkownika.
Inne zmienne predefiniowane przydatne przy wykonywaniu skryptów shell’a przedstawia rozdział ?? .
Zakres ważności zmiennych
Zakresem ważności zmiennych jest standardowo aktualny proces powłoki. Jeżeli zakres ten ma zostać rozszerzony, to zmienna musi zostać przesłana do procesów podrzędnych poleceniem: export zmienna
Instrukcja readonly
Instrukcja readonly służy do określenia zmiennych, których wartości nie mogą być zmieniane.
Zmiennych deklarowanych jako readonly nie można usunąć ze środowiska. Atrybut readonly nie jest przenoszony do shelli potomnych. Wydanie polecenia readonly bez argumentów spowoduje wyświetlenie listy zmiennych z ustawionym atrybutem readonly.
Przykład 3.2.6
$ readonly HOME
$ HOME=.
HOME: read-only variable
Dodatkowe informacje dotyczące zmiennych zawiera rozdział ?? .
28 października 2001 roku— wersja 0.2
42
Substytucja tekstów
Zasady zastępowania zmiennych powłoki występujących w linii polecenia ich wartościami ( substytucja parametrów ), przedstawia rozdział ?? . Rozdział 2.2.3 omawia zasady rozszerzania nazw plików zawierających metaznaki * ? [] ( substytucja nazw ).
Przed wykonaniem polecenia powłoka dokonuje substytucji parametrów, następnie substytucji nazw i dopiero tak rozszerzone argumenty przekazywane są do wykonania wywołanemu poleceniu.
Jeśli substytucja parametrów lub substytucji nazw ma nie zostać dokonana, to odpowiedni łańcuch znaków należy ująć w znaki cudzysłowu, wzgl. pojedynczy znak w łańcuchu poprzedzić symbolem lewego ukośnika \. Substytucja tekstów zawartych w apostrofach, cudzysłowach i akcentach w literaturze nosi nazwę mechanizmów klamrowania (ang. quoting mechanisms).
Mechanizm ten używa następujących znaków:
\ — lewy ukośnik — zabiera znaczenie występującemu po nim znakowi.
’ — apostrof — blokuje znaki specjalne do wystąpienia następnego apostrofu.
" — cudzysłów — blokuje specjalne znaczenie wszystkich znaków poza $ (substytucja zmiennej) i ‘ (substytucja wyników polecenia).
‘ — akcent — łańcuch zawarty między dwoma akcentami traktowany jest jak komenda i jest wykonywany.
Przykład 3.3.7
$ echo \
> ^D
$ echo ’\’
\
$ echo \’
’
$ _
Przykład 3.3.8
Wypróbuj poniższe polecenia:
$ echo ’Jesteśmy w katalogu $HOME’
$ echo "Jesteśmy w katalogu $HOME"
$ echo ‘Jesteśmy w katalogu $HOME‘
28 października 2001 roku— wersja 0.2
43
$ echo "Dzisiaj jest ‘date‘"
Tylko w drugim przypadku z każdej pary nastąpi substytucja, odpowiednio nazwy katalogu domowego i bieżącej daty.
Przykład 3.3.9
W systemie V i BSD polecenie echo wywołuje się z innymi parametrami, aby nie przenosiło kursora do nowej linii.
BSD:
echo -n Wciśnij [t] aby kontynuować; read odp
SysV:
echo Wciśnij [t] aby kontynuować \c; read odp
Oto fragment skryptu, uniezależniający działanie polecenia echo: if [ "’echo -n ’" = "-n" ]; then
n=""
c="\c"
else
n="-n"
c=""
fi
Wywołanie: echo $n komunikat $c
28 października 2001 roku— wersja 0.2
44