SOE - Systemy Operacyjne Wykład 4 Powłoka interpreter poleceń systemu UNIX dr inż. Andrzej Wielgus Instytut Mikroelektroniki i Optoelektroniki WEiTI PW
Powłoka Interpreter poleceń, powłoka (ang. shell) Przegląd sh -powłoka Bourne a csh -powłoka C ksh -powłoka Korna zsh -powłoka Z bash -powłoka Bash (GNU) tcsh
Działanie powłoki (1) Wartościowanie polecenia: podstawienie wartości zmiennych (interpretacja znaku $) podstawienie wyników poleceń (interpretacja znaków ``) podział na nazwę polecenia i argumenty (interpretacja separatorów) przekierowanie strumieni danych rozwinięcie nazw plików
Działanie powłoki (2) Rozpoznanie i wykonanie polecenia polecenie lub funkcja powłoki wykonuje bieżąca powłoka skrypt tworzy nowy proces (powłoka potomna) powłoka potomna wykonuje polecenia ze skryptu program tworzy nowy proces proces wczytuje kod programu
Uruchamianie programów przez powłokę (1) Proces na pierwszym planie $ program arg proces pierwszoplanowy korzysta z terminala powłoka czeka na zakończenie procesu i nie przyjmuje kolejnych poleceń Grupa procesów na pierwszym planie $ program1 ; program2 ; program3 procesy uruchamiane są sekwencyjnie
Uruchamianie programów przez powłokę (2) Proces na drugim planie (w tle) $ program arg & proces drugoplanowy nie korzysta z terminala powłoka przyjmuje kolejne polecenia Grupa procesów w tle $ program1 & program2 & program3 & procesy uruchamiane są współbieżnie
Uruchamianie programów przez powłokę (3) Grupa procesów w potoku $ program1 program2 program3 procesy uruchamiane są współbieżnie
Parametry powłoki Parametry są instancjami przechowującymi wartości Mogą być reprezentowane przez: nazwy (łańcuchy znaków) zmienne liczby naturalne parametry pozycyjne znaki specjalne parametry specjalne
Parametry Odwołanie do wartości dowolnego parametru następuje za pomocą znaku $ : $parametr ${parametr} Postać z nawiasami jest konieczna: gdy w poleceniu bezpośrednio za nazwą parametru chcemy umieścić inne znaki ${x}y gdy nazwa liczbowa składa się z więcej niż jednej cyfry ${11} Ustawianie wartości zależy od typu parametru
Zmienne Ustawianie wartości zmiennych zmienna=[wartość] typeset zmienna=[wartość] declare zmienna=[wartość] Jeśli wartość zostanie pominięta, to zmiennej zostanie przypisany zerowy ciąg znaków Usunięcie zmiennej umożliwia polecenie: unset zmienna Listę wszystkich zmiennych uzyskamy poleceniem: set
Zmienne środowiska Każdy tworzony proces, również każda powłoka, otrzymuje nowe środowisko w postaci tablicy zawierającej ciągi znaków: zmienna=wartość Każdy taki ciąg oznacza utworzenie nowej zmiennej środowiska Ten początkowy zestaw zmiennych środowiska jest dziedziczony po procesie macierzystym, którym najczęściej jest powłoka uruchamiająca nowy program
Zmienne środowiska Wyświetlanie całego środowiska printenv env Wyświetlanie wartości pojedyńczej zmiennej echo $zmienna Ustawianie zmiennej środowiska zmienna=wartość export zmienna w powłokach zsh i bash również: export zmienna=wartość
Wybrane zmienne środowiska LOGNAME, USER HOME LANG PATH CDPATH MANPATH LD_LIBRARY_PATH PWD SHELL TERM MAIL IFS TZ PS1 PS2 Nazwa zmiennej Katalog domowy zalogowanego użytkownika. Język lokalny. Ścieżka poszukiwań programów. Ścieżka poszukiwań katalogów. Ścieżka poszukiwań dokumentacji systemowej. Ścieżka poszukiwań bibliotek dynamicznych. Katalog bieżący. Powłoka uruchamiana po zalogowaniu użytkownika. Typ terminala. Skrzynka pocztowa zalogowanego użytkownika. Wejściowy separator pola. Strefa czasowa. Znaczenie Nazwa zalogowanego użytkownika. Podstawowy komunikat gotowości powłoki wyświetlany, gdy powłoka jest gotowa do przyjęcia kolejnego polecenia Wtórny komunikat gotowości powłoki wyświetlany, gdy powłoka oczekuje na dokończenie polecenia w następnej linii
Parametry specjalne Parametr # * @? $! - Znaczenie Liczba parametrów pozycyjnych. Lista parametrów pozycyjnych w postaci jednego ciągu znaków. Lista parametrów pozycyjnych w postaci oddzielnych ciągów znaków. Status zakończenia ostatnio uruchomionego polecenia. PID bieżącej powłoki. PID procesu ostatnio uruchomionego w tle. Lista opcji bieżącej powłoki. Przykłady użycia: $? umożliwia sprawdzenie w skrypcie, czy jakieś polecenie zakończyło się pomyślnie $$ zawiera identyfikator PID bieżącej powłoki, który można wykorzystać np. do stworzenia pliku tymczasowego o unikalnej nazwie
Parametry pozycyjne Parametr $0 $1, $2 $9 ${10}, ${11} $# $* $@ Znaczenie Nazwa skryptu. Wartości pierwszych 9 argumentów wywołania. Wartości kolejnych argumentów wywołania (tylko zsh, bash). Liczba parametrów pozycyjnych. Lista parametrów pozycyjnych w postaci jednego ciągu znaków. Lista parametrów pozycyjnych w postaci oddzielnych ciągów znaków. Przesuwanie parametrów pozycyjnych o n pozycji shift [n] Ustawienie nowego zestawu parametrów pozycyjnych set arg1 arg2 arg3
Znaki specjalne powłoki Zestaw znaków, którym powłoka nadaje specjalne znaczenie Umożliwiają m.in.: rozwijanie nazw plików cytowanie grupowanie poleceń przekierowanie strumieni podstawienie wartości zmiennych podstawienie wyników poleceń inne
Rozwijanie nazw plików (wyrażenia regularne) Znak Znaczenie? * [ ] zastępuje jeden dowolny znak zastępuje dowolny ciąg znaków zastępuje jeden znak z listy podanej wewnątrz nawiasów [ - ] zastępuje jeden znak z zakresu podanego wewnątrz nawiasów [^ ] lub [! ] zastępuje dowolny znak oprócz tych podanych wewnątrz nawiasów Przykłady: ls *.? ls *.[ch]
Cytowanie \ ` ` Znak Znaczenie zapobiega interpretacji następnego znaku zapobiegają interpretacji wszystkich znaków zawartych wewnątrz cudzysłowów, z wyjątkiem znaków $ i `` zapobiegają interpretacji wszystkich znaków zawartych wewnątrz apostrofów wykonuje polecenie zawarte wewnątrz znaków i wstawia w to miejsce strumień wyjściowy tego polecenia Przykłady: echo \$HOME echo Katalog bieżący: `pwd` echo Znaki specjalne powłoki: $ `` * \
Grupowanie poleceń Znak cmd ; cmd ; cmd cmd & cmd & cmd & cmd cmd cmd (cmd ; cmd) { cmd ; cmd ; } Znaczenie powłoka grupuje polecenia na pierwszym planie wykonując je sekwencyjnie powłoka grupuje polecenia w tle wykonując je asynchronicznie powłoka grupuje polecenia wykonując je w potoku powłoka grupuje polecenia i wykonuje w nowej powłoce powłoka grupuje polecenia i wykonuje w bieżącej powłoce, tworzy jeden strumień wyjściowy dla całej grupy poleceń i zwraca jeden status zakończenia Przykłady: ls lr / more sleep 50 & ps f sleep 50 ; ps -f
Strumienie danych Powłoka związuje z każdym tworzonym procesem trzy strumienie danych: stdin stdout stderror - standardowy strumień wejściowy, - standardowy strumień wyjściowy, - standardowy strumień błędów (diagnostyczny). Każdy ze strumieni związany jest z plikiem zwykłym lub z plikiem urządzenia wejścia/wyjścia. Domyślnym przywiązaniem dla wszystkich strumieni jest plik terminala. Każdy plik otwarty przez proces otrzymuje kolejny numer zwany deskryptorem pliku. Deskryptory 0, 1 i 2 zarezerwowane są dla plików związanych ze standardowymi strumieniami.
Przekierowanie strumieni Znak [d]<plik [d]>plik [d]>>plik [d]<>plik &>plik >&plik [d1]>&d2 Znaczenie przekierowanie wejścia powoduje otwarcie pliku do czytania z deskryptorem d; jeżeli d zostało pominięte przyjmowane jest 0 przekierowanie wyjścia powoduje otwarcie pliku do pisania z deskryptorem d; jeżeli d zostało pominięte przyjmowane jest 1 przekierowanie wyjścia powoduje otwarcie pliku do dopisywania z deskryptorem d; jeżeli d zostało pominięte, przyjmowane jest 1 przekierowanie powoduje otwarcie pliku do czytania i pisania z deskryptorem d, przekierowanie powoduje skierowanie strumienia wyjściowego i strumienia błędów do tego samego pliku przekierowanie powoduje zduplikowanie deskryptora pliku wyjściowego; deskryptor d1 staje się kopią deskryptora d2 i wskazuje na ten sam plik Przykłady: ps ef >procesy.txt ls lr >pliki.txt 2>bledy.log
Skrypty powłoki Plik tekstowy zawierający listę poleceń dla interpretera nosi nazwę skryptu. Skrypt może zawierać: odwołania do zmiennych, wbudowane polecenia interpretera, polecenia i pętle sterujące, wywołania programów i innych skryptów, komentarze.
Uruchamianie skryptów Jawne wywołanie nowej powłoki z pierwszym argumentem w postaci nazwy skryptu: sh skrypt arg... bash skrypt arg... Wywołanie nazwy skryptu: chmod +x skrypt skrypt arg... niejawne wywołanie nowej powłoki: domyślnie powłoka sh powłoka wskazana w pierwszej linii skryptu #!/bin/zsh
Uruchamianie skryptów Wykonanie skryptu w bieżącej powłoce:. skrypt arg... source skrypt arg... Przykład: source.zshenv..bashrc
Pętle sterujące (1) for zmienna [in słowo...] do lista_poleceń done Pętla wykonuje się raz dla każdego słowa z listy Jeśli lista zostanie pominięta, pętla wykonuje się raz dla każdego ustawionego parametru pozycyjnego Przykłady: for arg in $* do echo $arg for arg do echo $arg done done
Pętle sterujące (2) while lista_warunków do lista_poleceń done Pętla wykonywana jest dopóki ostatnie polecenie z listy warunków zwraca status zerowy until lista_warunków do lista_poleceń done Pętla wykonywana jest dopóki ostatnie polecenie z listy warunków zwraca status niezerowy
Polecenie warunkowe if if lista_warunków then lista_poleceń [elif lista_warunków then lista_poleceń]... [else lista_poleceń] fi Wykonywana jest gałąź, dla której ostatnie polecenie z listy warunków zwraca status zerowy
Sprawdzanie warunków Mechanizm wbudowany w powłokę zsh/bash [[ warunek ]] Polecenie test test warunek [ warunek ]
Testowanie atrybutów plików -r plik -w plik -x plik -f plik -d plik -c plik -b plik -p plik -s plik sprawdza, czy użytkownik posiada prawo do czytania sprawdza, czy użytkownik posiada prawo do pisania sprawdza, czy użytkownik posiada prawo do wykonywania sprawdza, czy plik to plik zwykły sprawdza, czy plik to katalog sprawdza, czy plik to plik specjalny znakowy sprawdza, czy plik to plik specjalny blokowy sprawdza, czy plik to plik FIFO sprawdza, czy plik to plik o niezerowej długości Przykład: if [ -w kat ] then cd kat mkdir nowy_kat fi
Testowanie liczb całkowitych n1 -eq n2 n1 -ne n2 n1 -gtn2 n1 -ge n2 n1 -lt n2 n1 -le n2 sprawdza czy n1 = n2 sprawdza czy n1 >< n2 sprawdza czy n1 > n2 sprawdza czy n1 >= n2 sprawdza czy n1 < n2 sprawdza czy n1 <= n2 Przykład: while [ $# -gt 0 ] do done echo $1 shift
Testowanie ciągów znaków s1 s1 = s2 s1!= s2 sprawdza, czy ciąg jest niezerowy sprawdza, czy ciągi są identyczne sprawdza, czy ciągi są różne Przykład: while [ $1 ] do done echo $1 shift
Łączenie i negowanie warunków Iloczyn [ warunek1 a warunek2 ] Suma [ warunek1 o warunek2 ] Negacja [! warunek ] Przykład if [! d $1 o! x $1 ] then echo Brak uprawnien do $1 else ls l $1 fi
Operacje arytmetyczne (1) Mechanizm wbudowany w powłokę zsh/bash $((wyrażenie)) let wyrażenie [wyrażenie...] Przykłady echo $((4+5)) x=$((x+1)) let x=x+1 -inkrementuje zmienną x
Operacje arytmetyczne (2) Program expr expr wyrażenie expr arg1 operator arg2... Podstawienie zmienna=`expr wyrażenie` Przykłady expr 3 \* 7 x=`expr $x + 1` -inkrementuje zmienną x expr $1 : '.*' -podaje liczbę znaków w $1
Program find find ścieżka wyrażenie Przykłady find / -name *.c find / -name proc.h find. type d print find. mtime -2 exec ls l {} \;
Filtry Filtry to grupa programów służących do wyszukiwania wzorców i/lub przetwarzania plików tekstowych
Program grep (1) grep [opcje] wzorzec [plik ] Program grep poszukuje w stdin lub w plikach wejściowych wierszy, które pasują do podanego wzorca. Każdy znaleziony wiersz jest przesyłany w całości na stdout. Opcje -c -n -v -podaje tylko liczbę dopasowanych linii, -dopisuje numer przed każdą dopasowaną linią, -wypisuje tylko te linie, które nie pasują do wzorca.
Program grep (2) Wzorzec ma postać wyrażenia regularnego, w którym mogą wystąpić znaki specjalne. Znak ^ $. * [ ] [ -] \ Początek wiersza. Koniec wiersza. Jeden dowolny znak. Znaczenie Dowolna liczba wystąpień poprzedzającego wyrażenia (w tym zero wystąpień). Jeden dowolny znak z listy zawartej wewnątrz nawiasów. Jeden dowolny znak z zakresu podanego wewnątrz nawiasów. Przywraca pierwotne znaczenie następnego znaku.
Program grep (3) Wersje programu: grep dopuszcza wzorce z podstawowym zakresem znaków specjalnych fgrep dopuszcza stosowanie tylko uproszczonych wzorców, które nie zawierają żadnych znaków specjalnych egrep dopuszcza wzorce z rozszerzonym zakresem znaków specjalnych
Program grep (4) Dodatkowe znaki specjalne programu egrep Znak +? {n} Znaczenie Liczba wystąpień poprzedzającego wyrażenia > 1. Liczba wystąpień poprzedzającego wyrażenia = 0 lub 1. Poprzedzające wyrażenie powtarza się dokładnie n razy.
Program grep (5) Przykłady ps ef grep sendmail ls l grep c ^d