Zajęcia z Unix-a cz 1 – kompilacja GCC.
Transkrypt
Zajęcia z Unix-a cz 1 – kompilacja GCC.
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 do 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 standardowych 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 Windows). 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 dołą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 niestandardowe pliku biblioteki – poza typowo przeszukiwanymi katalogami „/lib”, „/usr/lib” i katalogami opisanymi w ścieżkach zmiennej środowiskowej „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 budowad (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 przebudowaniu, 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 do 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 (dobre do testów) -I <katalog> : katalog do 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ę zbudowad jednego z celów -d : (debug) wyświetlane są informacje debugowania -W<plik> : wykonuje się tak jakby wymieniony plik był zmodyfikowany (do testowania) Zadania 1. Utworzyd w katalogu domowym (w domyślnym, po zalogowaniu do 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 dowolnego 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_do_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 do nowej linii po wykonaniu napisu. 5. Wybrane znaki specjalne powłoki: * – dowolny łaocuch ? – dowolny znak `polecenie` – zacytowanie polecenia (para apostrofów wstecznych) w celu przejęcia jego wyjscia np. rm –f `spis_plikow_do_usuniecia` [abc] – dowolny znak ze zbioru abc np. cat [abc]* ; – separator w grupie poleceo [a-z] – dowolny znak ze zbioru od a do 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 dostępu do katalogu domowego, 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 do 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 do odczytu -w plik plik istnieje do zapisu -x plik plik istnieje do 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 do lista_poleceo done Przykład – usuwanie podkatalogów „kat1”, „kat2” katalogu bieżącego for I in ./kat1 ./kat2 do rm –rf $I/* done Druga składnia (dla parametrów pozycyjnych): for zmienna do lista_poleceo done Przykład – odczytanie parametrów skryptu (pozycyjnych) for I do echo $I done Trzecia składnia (praktycznie tak jak w języku C): for ((warunek_startu; warunek_kooca; warunek_przyrostu)) do lista_poleceo done Przykład –wyświetlanie liczb od 1 do 4 for ((I=1; I<=4; I ++)) do echo $I done 14. Instrukcja “case” dokonują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 dole) 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 dokonanego 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 domowego. 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 docelowym 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.