LABORATORIUM 5


ZMIENNE INTERPRETERA POLECEŃ, ŚRODOWISKO I DZIEDZICZENIE

Proces interpretera poleceń (podobnie, jak inne procesy) przechowuje w swojej pamięci pewną liczbę zmiennych wraz z przyporządkowanymi im wartościami. Zarówno nazwy zmiennych, jak i przyporządkowane im wartości są łańcuchami (napisami). W pamięci procesu (dokładniej: w końcowym fragmencie segmentu danych zmiennych) są one przechowywane w postaci listy par:
 zmienna_1 = wartość_1
 zmienna_2 = wartość_2
 .....................
 zmienna_n = wartość_n 
(por. tablice asocjacyjne w języku PHP innych językach skryptowych). Użytkownik interpretera poleceń ma możliwość wyświetlania listy zmiennych oraz jej modyfikacji (dopisywania nowych zmiennych, usuwania zmiennych oraz zmiany ich wartości).
UWAGA: zmienne inicjowane w procesie bash'a w chwili jego uruchomienia mają wpływ na sposób jego funkcjonowania - nieostrożna zmiana ich wartości może utrudnić lub uniemożliwić dalsze korzystanie z bash'a w danym oknie tekstowym. Niektóre spośród zmiennych są zabezpieczone przed usunięciem i zmianą wartości (mogą tylko być odczytywane).
ZADANIA

Zad. 1
Zapoznać się z działaniem polecenia wewnętrznego set (bez argumentów), obejrzeć zbiór zmiennych i ich wartości wyświetlanych przez to polecenie. Zwrócić uwagę na zmienne HOME, PATH, PWD, PS1, SECONDS i spróbować odgadnąć ich znaczenie (zaobserwować, czy/kiedy zachodzi zmiana ich wartości).

Zad. 2
Przeczytać opis i zapoznać się z działaniem polecenia zewnętrznego env, porównać zbiór wyświetlanych zmiennych ze zbiorem wyświetlanym przez polecenie set.

Zad. 3
W podkatalogu public_html utworzyć plik o dowolnej nazwie z rozszerzeniem .php, prawach dostępu 705 (oktalnie) i następującej zawartości:
 <HTML>
 <BODY>
 <?PHP system("env"); ?>
 </BODY>
 </HTML>
obejrzeć plik w przeglądarce internetowej, porównać wyświetlony wykaz zmiennych środowiska serwera HTTP z wyświetlonym w zad.2 wykazem zmiennych środowiska bash'a.
UWAGA: po wykonaniu zadania należy usunąć utworzony plik, gdyż zwiększa on zagrożenie systemu serwera.

Zad. 4
Utworzyć kilka nowych zmiennych i przypisać im wartości pisząc zmienna=napis . wyświetlić wartości przy użyciu polecenia echo $zmienna. przypisać nowe wartości pisząc zmienna=nowy_napis , sprawdzić, że poprzednie wartości zostały nadpisane przez nowe. przypisać zmiennej pusty łańcuch: zmienna= , usunąć zmienną: unset zmienna .


Niektóre spośród wszystkich zmiennych danego procesu są oznakowane jako zmienne środowiska (są to te, które są wyświetlane przez polecenie env). Zmienne środowiska są dziedziczone przez wszystkie procesy potomne danego procesu (w momencie uruchomienia procesu potomnego są kopiowane do jego środowiska). Użytkownik bash'a ma możliwość zaznaczania zmiennych jako należących do środowiska (czyli przeznaczonych do dziedziczenia), jak również usuwania tego oznakowania.

Zad. 5
Sprawdzić, że polecenie set wyświetla utworzone zmienne, zaś polecenie env - nie wyświetla. Użyć polecenia export zmienna do umieszczenia jej w środowisku (wyeksportowania), sprawdzić, że polecenie env będzie ją teraz wyświetlało. Wypróbować działanie polecenia export -n zmienna (usunięcie ze środowiska). Uruchomić nową kopię bash'a (polecenie bash), sprawdzić, że odziedziczone zostały tylko te zmienne, które aktualnie były w środowisku pierwotnego bash'a. Wyłączyć kopię bash'a (polecenie exit).


Bash posiada dość bogatą kolekcją operacji na łańcuchach stanowiących wartości zmiennych - obliczanie długości, złączanie (konkatenacja), wycinanie podłańcuchów, sprawdzanie zgodności z podanym wzorcem i inne.

Zad. 6
Wypróbować możliwości wykonywania operacji na napisach stanowiących wartości zmiennych:
 zmienna=$zmienna1$zmienna2 #konkatenacja dwóch wartości zmiennych echo $zmienna
 zmienna=napis$zmienna1 #konkatenacja stażej i wartości zmiennej echo $zmienna
 echo ${#zmienna} #długość napisu
 echo ${zmienna:pozycja} #wyświetlenie podłańcucha końcowego od #danej pozycji (pozycje są numerowane od 0)
 echo ${zmienna:pozycja:długość} #wyświetlenie podłańcucha o danej długości #począwszy od danej pozycji
Przeczytać w opisie bash'a wykaz możliwości wykonywania bardziej złożonych operacji na łańcuchach. Jeśli wartości zmiennych są poprawnymi zapisami liczb całkowitych (w sensie reguł składniowych bash'a), jest możliwe wykonywanie na nich operacji arytmetycznych (z typowego zbioru udostępnianego przez języki programowania, w zakresie arytmetyki liczb całkowitych).

Zad. 7
Zadeklarować kilka zmiennych numerycznych (liczbowych) pisząc:
declare -i zmienna1 zmienna2 ... zmienna_n
Przyporządkować im wartości całkowitoliczbowe pisząc zmienna=liczba . Wypróbować możliwość wykonywania obliczeń arytmetycznych przy użyciu zadeklarowanych zmiennych:
a) zmienna=wyrażenie_arytmetyczne; echo $zmienna
b) echo $((wyrażenie_arytmetyczne))
Przeczytać w opisie bash'a wykaz dostępnych operatorów i reguły konstruowania wyrażeń arytmetycznych.

Zad. 8
Wypróbować wykonywanie działań arytmetycznych na: a) liczbach ósemkowych (zaczynających się od 0); b) liczbach szesnastkowych (zaczynających się od 0x lub 0X); liczbach przy dowolnej innej podstawie (zaczynających się od podstawa# , na przykład 2#100 oznacza liczbę binarną 100, czyli dziesiętną 4).
UWAGA: argumenty działań arytmetycznych mogą być liczbami o różnych podstawach, ale wynik zawsze będzie wyświetlony w postaci dziesiętnej.


Operator o postaci $(polecenie) (starsza forma: `polecenie` - uwaga: użyte są znaki odwrotnych apostrofów !) powoduje uruchomienie danego polecenia, a po jego zakończeniu zastąpienie powyższego napisu tym, co dane polecenie wyprowadziło na swoje wyjącie standardowe (z usuniętymi znakami nowej linii). Może to posłużyć do przypisania zmiennej wartości wyprowadzonej przez dane polecenie na wyjącie standardowe.

Zad. 9
Wypróbować działanie poleceń:
a) zmienna=$(cat nazwa_pliku); echo $zmienna
b) zmienna=$(ls); echo $zmienna
c) zmienna=$(ls | wc -l); echo $zmienna

Zad. 10
Obejrzeć zawartości plików systemowych /etc/profile i /etc/bashrc oraz własnych plików startowych .bash_profile i .bashrc . Przeczytać w opisie bash'a (rozdział INVOCATION), kiedy i w jakiej kolejności są one wykonywane. Uzupełnić zawartość pliku .bashrc o wyświetlenie własnego komunikatu powitalnego i ustawienie zmiennej środowiska PATH jak w poprzednim zadaniu. Zapisać plik, otworzyć nowe okno tekstowe i sprawdzić, że wprowadzone zmiany przynoszą skutek.
UWAGA: nie zepsuć skryptu, nie zmieniać praw dostępu !