Zajęcia z Unix-a cz 1 kompilacja GCC. Uwaga! W poniższym tekście każde wyrażenie typu <x> oznacza miejsce wstawienia odpowiedniej nazwy opisywanej przez x. Symbol *x+ oznacza występowanie x zero lub jeden raz. Kompilowanie plików źródłowych C postaci plików obiektów wymaga użycia opcji -c. gcc -c <nazwa_pliku>.c W wyniku otrzymuje się plik obiektu <nazwa_pliku>.o Jeśli plik nagłówka (.h) nie znajduje się w bieżącym katalogu ani w żadnym z katalogów zawierających nagłówki standarwych bibliotek to przy kompilacji stosowana jest opcja I <katalog_naglowka>. gcc c I <katalog_naglowka> <nazwa_pliku>.c Scalanie plików obiektów w program wykonywalny wymaga użycia opcji -o gcc o <nazwa_celu> <nazwa_pliku1>.o <nazwa_pliku2>.o <nazwa_celu> oznacza nazwę pliku wykowywalnego, która może, ale nie musi mied żadnego konkretnego rozszerzenia (takiego jak np. exe w systemie Winws). W wielu systemach uniksowych można połączyd kompilację i scalanie plików w jednym poleceniu: gcc o <nazwa_celu> <nazwa_pliku1>.c <nazwa_pliku2>.c Archiwum (bilbioteka statyczna) to zestaw wielu plików obiektów przechowywanych w pojedynczym pliku o rozszerzeniu.a. Tworzy się je poleceniem ar z opcjami cr : ar -crs lib<nazwa_bilbioteki>.a <nazwa_pliku1>.o <nazwa_pliku2>.o Archiwum łącza się na etapie scalania plików obiektów w program wykonywalny z wykorzystaniem opcji -L i -l. -L<nazwa_katalogu> : wskazuje położenie niestandarwe pliku biblioteki poza typowo przeszukiwanymi katalogami /lib, /usr/lib i katalogami opisanymi w ścieżkach zmiennej śrowiskowej LD_LIBRARY_PATH. -l<nazwa_biblioteki> : opcja scalania wybranej biblioteki z naszym programem wykonywalnym (celem). gcc o <nazwa_celu> <nazwa_pliku1>.c <nazwa_pliku2>.c L<nazwa_katalogu_biblioteki> l<nazwa_biblioteki>
Kompilacja i scalanie programów C poprzez polecenie make (LINUX) Polecenie make szuka w bieżącym katalogu pliku tekstowego o nazwie makefile lub Makefile w podanej kolejności. Plik ten zawiera reguły opisujące dla make co buwad (wykonywad ) i w jaki sposób. Reguły pliku make mają następującą formę ogólną: <nazwa_celu>: <zależnośd> *<zależnośd>+ * + <tabulator> <polecenie> [<tabulator> <polecenie>] * + Cel jest plikiem binarnym(wykonywalnym) lub obiektowym (.o), który chcemy utworzyd. Polecenia są krokami takimi jak wywołania kompilatora lub poleceo powłoki koniecznymi dla utworzenia celu. Jeśli cel nie istnieje make go buduje zgodnie z poleceniem. W przeciwnym razie porównuje daty tworzenia celu z datami jego zależności. Jeśli są one póżniejsze niż cel (przynajmniej jedna) cel podlega przebuwaniu, bo zmienił się jakiś kod. Przykład: prog.e: m1.c m2.c gcc o prog.e m1.o m2.o m1.o: m1.c m1.h gcc c m1.c m2.o: m2.c m1.h gcc c m1.c clean: rm *.o *.e Wybrane zmienne automatyczne stosowane w plikach make : $@ -symboliczna nazwa pliku celu w regule $* -rdzeo nazwy pliku (bez rozszerzenia po kropce) $< -nazwa pliku pierwszej zależności od reguły $^ -lista wszystkich zależności w regule $? - lista zależności nowszych niż cel Zmienne lokalne w plikach make sa przypisywane różnym poleceniom na początku skryptu. Przypisanie takie (nierekursywne) ma postad: <zmienna>:=<polecenie lub wartośd> np. : CC := gcc CFLAGS := -g Odwołanie takich zmiennych występuje w formie $(<zmienna>) np. :
$(CC) $(CFLAGS) Ogólna reguła kompilacji plików źródłowych C w poleceniu make z użyciem zmiennych automatycznych może mied postad:.c.o: $(CC) $(CFLAGS) c $*.c Będzie ona niejawnie cytowana przy tworzeniu celu: <plik_wykonywalny>: <plik>.c <plik>.c $(CC) $(CFLAGS) $^ -o $@ Przykład prostego pliku Makefile z użyciem reguł niejawnych, zmiennych lokalnych i zmiennych automatycznych: CC := gcc CFLAGS := -g.c.o: $(CC) $(CFLAGS) c $*.c prog.e: m1.c m2.c $(CC) $(CFLAGS) $^ -o $@ clean: rm f *.o *.e W jednym pliku Makefile można definiowad wiele różnych celów kompilowad i scalad wiele programów. Wywołanie make odbywa się z odpowiednim parametrem stanowiącym nazwę celu i może zawierad opcje: make [-<opcje>] <nazwa_celu lub plik_wykonywalny> np.: make prog.e make clean. Wybrane opcje polecenia make (nie muszą występowad): -n : polecenia są składane i wyświetlane, ale nie wykonywane (bre testów) -I <katalog> : katalog poszukiwania plików make poza katalogiem bieżącym -s : (silent) make nie wypisuje poleceo na ekranie -f <plik> : nazwa pliku make inna niż makefile lub Makefile -k : nie przerywa działania jeśli nie uda się zbuwad jednego z celów -d : (debug) wyświetlane są informacje debugowania -W<plik> : wykonuje się tak jakby wymieniony plik był zmodyfikowany ( testowania)
Zadania 1. Utworzyd w katalogu mowym (w myślnym, po zalogowaniu Ubuntu) katalog programy oraz utworzyd pliki źródłowe języka C - main.c, modul.c oraz plik nagłówkowy modul.h. Wpisad przy pomocy wolnego edytora treści plików podane przez prowadzącego laboratorium na tablicy. Program generuje napisy powitalne języka C wyświetlane w konsoli. 2. Skompilowad pliki źródłowe C przy pomocy polecenia gcc z opcją -c w celu uzyskania plików obiektów (.o). Utworzyd plik programu wykonywalnego witaj.e poprzez scalanie wytworzonych plików obiektów poleceniem gcc z opcją o. Uruchomid program. 3. Skompilowad i scalid powyższe pliki źródłowe w program wykonywalny jednym poleceniem gcc, bez etapu pośredniego wytwarzania plików obiektów. Uruchomid program. 4. Utworzyd w katalogu bieżącym plik makefile zawierający dwa cele: witaj.e kompilacja i scalanie programu wynikowego o nazwie zgodnej z nazwą celu, w oparciu o źródła C z punktu 2 clean usunięcie z bieżącego katalogu wytworzonych plików obiektów (.o) i pliku wykonywalnego.
Zajęcia z Unix-a cz 2 skrypty BASH. 1. Ustalenie rodzaju interpretera w pierwszej linii skryptu #!scieżka shella np. #!/bin/bash 2. Wykonywanie skryptu Plikowi skryptu nadaje się atrybut wykonywalności: chmod u+x nazwa_skryptu i uruchamia się go w bieżącym katalogu poprzez wywołanie./nazwa_skryptu 3. Linia komentarza -poprzedzona znakiem # # treśd komentarza Cytowanie przy użyciu znaku maskujacego \ zapobiega interpretacji następnego znaku jako znaku specjalnego (sterującego) 4. Wyświetlanie napisów poprzez cudzysłowy( ) lub apostrofy ( ): echo treśd napisu lub echo treśd napisu np. echo mój komentarz lub echo mój komentarz Opcja (-n) komendy echo echo n napis oznacza brak przejścia nowej linii po wykonaniu napisu. 5. Wybrane znaki specjalne powłoki: * wolny łaocuch? wolny znak `polecenie` zacytowanie polecenia (para apostrofów wstecznych) w celu przejęcia jego wyjscia np. rm f `spis_plikow usuniecia` [abc] wolny znak ze zbioru abc np. cat [abc]* ; separator w grupie poleceo [a-z] wolny znak ze zbioru od a z tekst para apostrofów otacza daną łaocuchową (likwiduje działanie znaków specjalnych np. $ umieszczonych w środku!!!!) tekst para cudzysłowów otacza łaocuch 6. Parametry skryptu: $1, $2, $9 kolejne parametry uruchomionego skryptu $0 nazwa samego skryptu $* napis zawierający ciąg wszystkich parametrów $@ ciąg napisów o wartościach parametrów $# liczba parametrów skryptu $? kod (status) po wykonaniu ostatniego polecenia 7. Zmienne powłoki są deklarowane w momencie przypisania Przypisanie: nazwa_zmiennej=wartośd (nie wolno zostawiad spacji wokół =) tablica*indeks+=wartośd
tablica=(wartośd_1 wartośd_2 wartośd_n) echo @zmienna zmienna2=@zmienna1 echo ${tablica[indeks]} zmienna=${tablica[indeks]} echo ${tablica[*]} wyświetlenie całej tablicy (* lub @)) echo ${#tablica[*]} ilośd (#) elementów całej tablicy (* lub @)) Indeksy tablic są liczone od zera i nie muszą byd kolejne. Wybrane zmienne predefiniowane: HOME ścieżka stępu katalogu mowego, USER login użytkownika, PATH zbiór ścieżek przeszukiwania OSTYPE łaocuch opisu systemu operacyjnego UID identyfikator użytkownika RANDOM generator kolejnej liczby losowej Zmienne predefiniowane są globalne; zmienne lokalne można eksportowad procesów potomnych poprzez: export nazwa_zmiennej 8. Wyrażanie warunków Odbywa się poprzez polecenia: test wyrażenie-testowe lub [<spacja>wyrażenie-testowe<spacja>] Wyrażenia testowe dla liczb całkowitych a i b a eq b a=b a ne b a b a le b a b a lt b a<b a ge b a b a gt b a>b Wyrażenia testowe dla łaocuchów -z łaocuch łaocuch zerowy (pusty) -n łaocuch łaocuch niezerowy łaocuch1 == łaocuch2 łaocuchy identyczne łaocuch1!= łaocuch2 łaocuchy różne Wyrażenia testowe dla plików -e plik plik istnieje -d katalog katalog istnieje -r plik plik istnieje odczytu -w plik plik istnieje zapisu -x plik plik istnieje wykonania plik1 nt plik2 plik1 jest nowszy niż plik12 plik1 ot plik2 plik1 jest starszy niż plik12
Wyrażenia testowe logiczne ( wyr ) wyrażenie prawdziwe! wyr wyrażenie fałszywe wyr1 a wyr2 koniunkcja wyr1 o wyr2 alternatywa W wyrażeniu testowym znaki operatorów muszą byd odseparowane spacjami. 9. Wczytywanie danych od użytkownika: read zmienna1 zmienna2 Przykład: echo Podaj imie i nazwisko: read IMIE NAZWISKO echo Imię: $IMIE echo Nazwisko: $NAZWISKO 10. Łączenie poleceo koniunkcja: polecenie1 && polecenie2 alternatywa: polecenie1 polecenie2 { polecenie1; polecenie2; } - grupa poleceo wykonywanych przez powłokę ( polecenie1; polecenie2; ) - grupa poleceo wykonywanych przez podpowłokę 11. Wyrażenia arytmetyczne zmienna=$((wyrażenie)) expr wyrażenie!!!! W wyrażeniu po expr argumenty i operatory muszą byd oddzielane spacjami!!!! Operatory w wyrażeniach: +, -, *, =(logiczne porównanie),!=, >, <, >=, <=, &(iloczyn logiczny), (suma logiczna), length(długośd_łaocucha), : (porównanie) Instrukcja echo $? zwraca kod wyjścia z wyrażenia (0 jeśli OK.) Przykład: expr 5 = 4 - zwraca 0 expr length programowanie skryptow expr 1 + 2 \* 4 - zwraca wartośd 9 expr $z + 3 \< 2 Nawiasy (, ) oraz operatory, które potencjalnie mogą byd znakami specjalnymi powłoki należy cytowad np. \*, \&, \), \<, \> itp. 12. Instrukcja if występuje jako: if [ wyrażenie(warunek) ] then polecenia fi
lub w postaci if [ wyrażenie(warunek) ] then polecenia else inne polecenia fi Przykład: if [ $# -eq 2 ] then echo Skrypt ma 2 parametry else echo Skrypt nie ma 2 parametrów fi 13. Pętla for Pierwsza składnia: for zmienna in lista_możliwości lista_poleceo Przykład usuwanie podkatalogów kat1, kat2 katalogu bieżącego for I in./kat1./kat2 rm rf $I/* Druga składnia (dla parametrów pozycyjnych): for zmienna lista_poleceo Przykład odczytanie parametrów skryptu (pozycyjnych) for I echo $I Trzecia składnia (praktycznie tak jak w języku C): for ((warunek_startu; warunek_kooca; warunek_przyrostu))
lista_poleceo Przykład wyświetlanie liczb od 1 4 for ((I=1; I<=4; I ++)) echo $I 14. Instrukcja case konująca wyboru pewnych grup poleceo zależnie od wartości zmiennej testującej case zmienna_testowa in wzorzec1 ) grupa_poleceo_1 ;; wzorzec2 ) grupa_poleceo_2 ;;... * ) inne_przypadki ( opcjonalnie) ;; esac We wzorcach można wykorzystywad znaki *,? oraz zbiory znaków np. *0-9], [a-z]. Kilka wzorców dla jednej grupy poleceo oddziela się symbolem oznaczającym operację lub. Przykład: case $1 in START poczatek ) echo parametr START ;; # koniec opcji STOP ) echo parametr STOP ;; # koniec opcji esac Zadania 1. Utworzyd przy pomocy skryptu prostą stronę HTML (patrz przykład na le) na żółtym tle z napisem Moja strona HTML utworzona przez skrypt wycentrowanym poziomo u góry strony. Przykład kodu HTML strony dla zadania 1: <HTML><HEAD><TITLE> Tytuł mojej strony</title></head> <BODY BGCOLOR =YELLOW> <P ALIGN=CENTER><H1> To jest strona HTML wytworzona przez skrypt </H1></P> </BODY> </HTML>
2. Napisad skrypt wyświetlający swoją nazwę, ilośd parametrów wywołania oraz wykaz tych parametrów zależnie od wyboru konanego przez użytkownika. 3. Napisad skrypt powłoki Bash lista.sh umożliwiający uzupełnianie o dane kolejnych osób listy studentów, przechowywanych w pliku tekstowym o nazwie studenci utworzonym w podkatalogu projekty własnego katalogu mowego. Dane obejmują pozycje: Nazwisko, Imię, Adres, Telefon, Grupa dziekaoska. 4. Napisad skrypt powłoki Bash budujący plik tekstowy wykonywalne z nazwami plików wykonywalnych istniejących w bieżącym katalogu. 5. Napisad skrypt polaczenie z 3 parametrami. Dwa pierwsze to nazwy plików tekstowych, które skrypt powinien ze sobą połączyd w celowym pliku opisanym trzecim parametrem. Należy sprawdzid istnienie plików argumentów oraz pliku wynikowego. Jeśli plik wynikowy już istnieje to trzeba go utworzyd od nowa.