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.

Podobne dokumenty