Informatyka 3 - Systemy operacyjne - Lekcja 4
1. Działanie interpretera poleceń
W systemach UNIX i Linux interpreter poleceń określany jest również jako powłoka (ang. shell).
Nazwa wywodzi się stąd, że program ten pełni rolę warstwy pośredniczącej między użytkownikiem
a systemem operacyjnym. W dalszej części podręcznika będziemy posługiwać się zamiennie
obydwoma określeniami.
(1.1) Przegląd interpreterów
Pierwszym interpreterem napisanym dla systemu UNIX był sh, czyli powłoka Bourne'a (ang.
Bourne shell). Program ten odznacza się dużą szybkością działania i z tego względu jest wciąż
powszechnie wykorzystywany do uruchamiania skryptów. Jego funkcjonalność jest niestety mocno
ograniczona podczas pracy interaktywnej ze względu na brak licznych udogodnień, które oferują
nowocześniejsze powłoki.
Znacznie wygodniejszy jest drugi klasyczny interpreter csh (ang. C shell). Program csh oferuje m.in.
historię poleceń, aliasy, i sterowanie pracami. Składnia złożonych poleceń jest bardzo zbliżona do
języka C (w którym został napisany) i różni się znacząco od składni stosowanej w sh.
Trzecim klasycznym interpreterem jest ksh (ang. Korn shell), stanowiący rozszerzenie programu sh
o wiele nowych funkcji. Z założenia, ksh przeznaczony był dla administratorów i raczej nie zdobył
uznania zwykłych użytkowników ze względu na skomplikowaną składnię.
Ż aden z wymienionych programów nie jest dostępny w klasycznej wersji w
systemie Linux.
Obecnie największą popularność cieszą się nowoczesne interpretery łączące duże możliwości z
łatwością obsługi. Należy tu wymienić powłoki zsh i bash (ang. Bourne Again shell), powstałe z
rozwinięcia sh, oraz powłokę tcsh. Powłoka zsh staje się powoli standardem systemu UNIX, zaś
bash jest od samego początku podstawowym i domyślnym interpreterem Linuxa.
W dalszej części tej lekcji opisujemy powłokę bash.
(1.2) Pliki konfiguracyjne
Powłoka bash może wykorzystać kilka plików konfiguracyjnych w zależności od sposobu
uruchomienia.
Powłoka uruchomiona po zalogowaniu użytkownika (ang. login shell) odczytuje kolejno zawartość
następujących plików:
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
Każda powłoka interaktywna z wyjątkiem powłoki logowania odczytuje zawartość plików:
Informatyka 3 - Systemy operacyjne - Lekcja 4
/etc/bashrc
~/.bashrc
(1.3) Edycja poleceń
Powłoka bash daje bogate możliwości edycji poleceń. Pozwala łatwo modyfikować wpisane
polecenie poprzez przemieszczanie się kursorami i w wierszu, usuwanie niepoprawnych
znaków i wstawianie nowych. Jest to szczególnie przydatne do poprawiania długich poleceń
złożonych z wielu wyrazów, w których błąd popełniono na samym początku. Opisany poniżej
mechanizm historii pozwala przywołać takie polecenie, poprawić i ponownie wykonać.
Interpreter umożliwia ponadto uzupełnianie nazw poleceń i plików podczas edycji wiersza
polecenia. Po wprowadzeniu początkowego fragmentu nazwy polecenia można wcisnąć [Tab], aby
powłoka odnalazła i uzupełniła nazwę. Poszukiwania prowadzone są wśród wbudowanych poleceń
oraz w katalogach wymienionych w ścieżce poszukiwań programów PATH. Podobnie odbywa się
uzupełnianie nazw plików z tym, że poszukiwania dotyczą tylko jednego katalogu wskazanego w
początkowym fragmencie nazwy ścieżkowej pliku (domyślnie jest to katalog bieżący). W obydwu
przypadkach, jeśli bash odnajdzie kilka pasujących nazw, to wyświetla ich listę dając
użytkownikowi możliwość wyboru.
Po zakończeniu edycji użytkownik zatwierdza polecenie wciskając [Enter].
(1.4) Wartościowanie i wykonywanie poleceń
Każde polecenie wydane przez użytkownika jest analizowane przez interpreter, rozwijane do pełnej
postaci i dopiero wykonywane. Interpreter wykonuje kolejno następujące operacje:
podstawia wartości zmiennych (interpretacja znaku $),
podstawia wyniki poleceń (interpretacja znaków ``),
dokonuje podziału na nazwę polecenia i argumenty (interpretacja separatorów),
wykonuje przekierowanie strumieni danych,
rozwija nazwy plików,
rozpoznaje i wykonuje polecenie.
Jeśli interpreter rozpozna nazwę funkcji lub wbudowanego polecenia, to sam je wykonuje. Jeżeli
rozpozna nazwę programu lub skryptu, to uruchamia go jako nowy proces potomny.
Każde polecenie zwraca swój status zakończenia. Przyjęto konwencję, że zerowy status oznacza
pomyślne zakończenie, zaś wartość niezerowa jest zwracana, gdy polecenia nie udało się wykonać.
Jeśli polecenie zostało przerwane przez sygnał o numerze n, to zwracana jest wartość 128 + n.
(1.5) Historia wydawanych poleceń
Interpreter może przechowywać listę ostatnio wydanych poleceń i udostępniać je użytkownikowi do
powtórnego wykorzystania. Mechanizm ten nosi nazwę historii poleceń.
Oryginalna powł oka Bourne'a sh nie ma wbudowanego mechanizmu
historii.
Powłoka bash udostępnia historię poleceń, jeśli ustawiona jest opcja history (patrz punkt 2.5).
Informatyka 3 - Systemy operacyjne - Lekcja 4
Liczbę pamiętanych poleceń określa zmienna HISTSIZE ustawiana domyślnie na wartość 500. Po
uruchomieniu, bash zaczyna pracę z pustą listą historii, ale może ją zainicjować z pliku określonego
zmienną HISTFILE. Domyślnie jest to plik ~/.bash_history. Maksymalną liczbę linii w pliku
określa zmienna HISTFILESIZE.
Aktualną listę historii można wypisać poleceniem history. Każde z zapamiętanych poleceń
poprzedzone jest swoim numerem. Posługując się tym numerem lub początkowym fragmentem
nazwy, można przywołać konkretne polecenie w następujący sposób:
! - ogólna postać odwołania do historii poleceń,
identyfikator
!! - przywołuje ostatnie polecenie,
!n - przywołuje polecenie o numerze n,
!-n - przywołuje polecenie położone n pozycji od końca listy czyli od ostatniego
polecenia,
!string - przywołuje polecenie rozpoczynające się ciągiem znaków string.
Istnieje też drugi sposób korzystania z historii poleceń, który w większości przypadków jest znacznie
wygodniejszy.
Powłoka bash umożliwia przeglądanie listy w linii poleceń przy użyciu kursorów oraz .
Przywołane polecenie można potem modyfikować jak opisano w punkcie 1.3.
(1.6) Aliasy
Istotne ułatwienie do wielokrotnego posługiwania się złożonymi poleceniami wnoszą aliasy.
Umożliwiają zastąpienie wieloczłonowego polecenia pojedyńczym wyrazem. Nową nazwą można
się posługiwać tak, jak każdym innym poleceniem, dodając opcje i argumenty. Nie ma jednak
możliwości wstawienia zmiennych argumentów do tekstu samego aliasu.
Mechanizm aliasów jest dostę pny w wię kszości interpreterów (z wyjątkiem
sh ), ale tylko w tych egzemplarzach, które został y uruchomione w trybie
interaktywnym. W związku z tym aliasy nie są na ogół dostępne w
skryptach.
Każda uruchomiona powłoka przechowuje niezależnie własną listę aliasów zdefiniowanych przy
pomocy wbudowanego polecenia:
alias [-p] [nazwa=wartość ...]
alias [nazwa ...]
Polecenie wywołane bez argumentów lub z opcją -p wypisuje pełną listę aliasów. Jeśli podane są
tylko nazwy aliasów, powłoka wypisuje ich wartości. Dla argumentów w postaci nazwy z przypisaną
wartością tworzone są nowe aliasy. Jeżeli przypisywana wartość składa się z kilku wyrazów (np.
polecenie z opcjami i argumentami), to należy podać ją w cudzysłowach bądz apostrofach.
alias ll="ls -l"
Przykład
alias l='ls -FC'
Informatyka 3 - Systemy operacyjne - Lekcja 4
Aliasy zwykle ustawiane są w plikach konfiguracyjnych odczytywanych przez powłoki
interaktywne, czyli w plikach: /etc/bashrc i ~/bashrc.
Usuwanie aliasów umożliwia polecenie:
unalias [-a] [nazwa ...]
Następny segment
Informatyka 3 - Systemy operacyjne - Lekcja 4
2. Konfigurowanie interpretera
Sposób działania interpretera jest w dużym stopniu ustalany przez parametry i opcje.
(2.1) Parametry
Parametry są instancjami przechowującymi wartości. Mogą być reprezentowane przez nazwę w
postaci ciągu znaków, liczbę naturalną lub jeden ze znaków specjalnych.
Parametry reprezentowane przez liczbę naturalną noszą nazwę parametrów pozycyjnych i
przechowują argumenty wywołania powłoki.
Parametry specjalne mają postać pojedyńczych znaków specjalnych a ich wartości są
automatycznie ustawiane i modyfikowane dynamicznie przez powłokę.
Parametry reprezentowane przez nazwę określane są jako zmienne. Ustawianie wartości zmiennych
odbywa się za pomocą jednego z trzech poleceń:
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
Zmienne można podzielić na dwie kategorie:
1. zmienne środowiska,
2. zmienne lokalne powłoki.
Listę wszystkich zmiennych, zarówno lokalnych jak i środowiska, uzyskamy poleceniem:
set
Odwołanie do wartości dowolnego parametru następuje za pomocą znaku $ w następujący sposób:
$parametr
${parametr}
Postać z nawiasami jest konieczna, gdy w poleceniu bezpośrednio za nazwą parametru chcemy
umieścić inne znaki oraz gdy nazwa liczbowa składa się z więcej niż jednej cyfry.
Przykład
[apw@venus]$ x=abc
Informatyka 3 - Systemy operacyjne - Lekcja 4
[apw@venus]$ echo $x
abc
[apw@venus]$ echo $x123
[apw@venus]$ echo ${x}123
abc123
(2.2) Zmienne środowiska
Każdy tworzony proces, w tym 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.
W trakcie działania procesu środowisko może być modyfikowane poprzez usuwanie i dodawanie
nowych zmiennych oraz przez zmiany ich wartości. Wszystkie modyfikacje znajdują
odzwierciedlenie we wspomnianej tablicy. Zmiany te jednak nie przenoszą się do procesu
macierzystego. Zasada ta dotyczy również procesów potomnych danego procesu utworzonych przed
modyfikacją środowiska.
Zmienne środowiska wyróżnia więc to, że nie są związane tylko z lokalną powłoką, ale są
dziedziczone przez wszystkie procesy potomne tworzone przez powłokę.
Są wykorzystywane przez różne procesy a nie tylko przez proces powłoki. Nie można ich jednak
traktować jako zmienne globalne, gdyż nie stają się widoczne dla wszystkich procesów.
Całe środowisko można wyświetlić przy pomocy poleceń:
printenv
lub
env
Wartość pojedyńczej zmiennej wypisze polecenie:
echo $zmienna
Dodanie do środowiska nowej zmiennej polega na wyeksportowaniu zmiennej lokalnej, której trzeba
wcześniej przypisać właściwą wartość:
zmienna=wartość
export zmienna
Można to również zrobić w jednym etapie wydając polecenie:
export zmienna=wartość
Informatyka 3 - Systemy operacyjne - Lekcja 4
Zmienną środowiska można usunąć poleceniem unset, podobnie jak zmienną lokalną.
W tablicy 4.1 zebrano najważniejsze zmienne środowiska definiowane w każdej powłoce i
wyjaśniono ich znaczenie dla powłoki i innych procesów.
Tablica 4.1 Najważniejsze zmienne środowiska
Nazwa zmiennej Znaczenie
LOGNAME Nazwa zalogowanego użytkownika.
USER Nazwa zalogowanego użytkownika.
HOME Katalog domowy zalogowanego użytkownika.
LANG Język lokalny.
PATH Ścieżka poszukiwań programów.
CDPATH Ścieżka poszukiwań katalogów.
MANPATH Ścieżka poszukiwań dokumentacji systemowej.
LD_LIBRARY_PATH Ścieżka poszukiwań bibliotek dynamicznych.
PWD Katalog bieżący.
SHELL Powłoka uruchamiana po zalogowaniu użytkownika.
TERM Typ terminala.
MAIL Skrzynka pocztowa zalogowanego użytkownika.
MAILCHECK Częstotliwość sprawdzania skrzynki pocztowej.
IFS Wejściowy separator pola.
TZ Strefa czasowa.
(2.3) Zmienne lokalne powłoki
Zmienne lokalne mają znaczenie wyłącznie dla bieżącej powłoki i tylko w niej są widoczne. Nie
podlegają dziedziczeniu i nie mogą być wykorzystane przez inne procesy. Sposób definiowana i
usuwania zmiennych opisano powyżej. W tablicy 4.2 opisane zostały wybrane zmienne powłoki.
Tablica 4.2 Wybrane zmienne lokalne powłoki bash
Nazwa zmiennej Znaczenie
BASH Pełna nazwa ścieżkowa interpretera poleceń.
HISTFILE Nazwa pliku przechowującego historię wydawanych poleceń.
HISTFILESIZE Maksymalna liczba linii w pliku historii poleceń.
HISTSIZE Liczba pamiętanych poleceń.
PS1 Podstawowy komunikat gotowości powłoki wyświetlany, gdy powłoka
jest gotowa do przyjęcia kolejnego polecenia.
PS2 Wtórny komunikat gotowości powłoki wyświetlany, gdy powłoka
oczekuje na dokończenie polecenia w następnej linii.
Zmienne PS1 i PS2 mogą być również ustawione jako zmienne środowiska. Definiują one sposób, w
Informatyka 3 - Systemy operacyjne - Lekcja 4
jaki powłoka zgłasza gotowość do dalszej pracy. Jeśli powłoka jest gotowa do przyjęcia kolejnego
polecenia, to wyświetla komunikat gotowości zawierający ciąg znaków przypisany zmiennej PS1.
Jeśli powłoka wymaga jeszcze dodatkowych danych wejściowych, żeby dokończyć polecenie, to
wyświetla ciąg znaków przypisany zmiennej PS2. Podstawowe komunikaty zawierają tylko jeden
znak, odpowiednio $ lub >. Stąd wywodzi się inna nazwa takiego komunikatu - znak zachęty
powłoki. Najczęściej stosuje się jednak dłuższe komunikaty, które mogą zawierać nazwę komputera,
nazwę użytkownika, nazwę bieżącego katalogu czy numer polecenia.
Przykład
Poniżej przedstawiono przykładowe wartości zmiennych PS1 i PS2 oraz ich
efekt w postaci komunikatów gotowości powłoki.
[apw@venus apw]$ echo $PS1
[\u@\h \W]\$
[apw@venus apw]$ echo $PS2
>
(2.4) Parametry specjalne
Każda powłoka ustawia automatycznie kilka parametrów specjalnych, których wartości zmieniają
się w trakcie jej działania. W tablicy 4.3 przedstawiamy znaczenie tych parametrów.
Tablica 4.3 Parametry specjalne powłoki bash
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.
Parametr $? umożliwia sprawdzenie w skrypcie, czy jakieś polecenie zakończyło się pomyślnie.
Parametr $$ zawiera identyfikator PID bieżącej powłoki, który można wykorzystać np. do
stworzenia pliku tymczasowego o unikalnej nazwie.
(2.5) Parametry pozycyjne
Parametry pozycyjne reprezentowane są przez kolejne liczby naturalne.
Parametr $0 przechowuje nazwę powłoki lub nazwę skryptu. Parametry $1, $2, $3 ... przechowują
kolejne argumenty. Odwołania do parametrów o wyższych numerach, składających się z kilku cyfr,
wymagają użycia nawiasów klamrowych: ${10}, ${11} ... Powłoka bash nie ogranicza więc
możliwości bezpośredniego dostępu do wszystkich parametrów, podczas gdy w powłoce sh istnieje
ograniczenie tylko do pierwszych 9 parametrów: $1, ... $9 a dostęp do pozostałych otrzymuje się po
Informatyka 3 - Systemy operacyjne - Lekcja 4
przesunięciu.
Wszystkie parametry pozycyjne można jednocześnie przesunać w lewo o dowolną liczbę pozycji za
pomocą polecenia:
shift [n]
Gdy argument nie jest podany, domyślnie następuje przesunięcie wszystkich parametrów o jedną
pozycję. W rezultacie parametr $1 jest usuwany (bezpowrotnie), parametr $2 przesuwa się na $1,
parametr $3 na $2 itd. W przypadku gdy parametr n jest podany przesuwanie argumentów następuje
o n pozycji, tzn. n pierwszych argumentów jest usuwanych a pozostałe zajmują pozycje zaczynając
od $1.
Parametr $0 nigdy nie podlega przesunię ciu i zawsze przechowuje nazwę.
Powłoka ustawia również trzy parametry specjalne związane z parametrami pozycyjnymi. Parametr
$# określa liczbę ustawionych parametrów pozycyjnych z wyjatkiem parametru $0. Parametr $*
przechowują całą listę parametrów pozycyjnych w postaci jednego ciągu znaków "$1 $2 $3 ...",
natomiast $@ przechowuje tę listę w postaci oddzielnych ciągów "$1" "$2" "$3" ...
Początkowe ustawienie parametrów pozycyjnych można zmienić poleceniem:
set arg1 arg2 arg3 ...
Polecenie zmienia na raz wszystkie parametry pozycyjne, usuwając stare wartości i przypisując
części z nich nowe wartości podane w poleceniu. Nie ma możliwości zmiany tylko wybranych
parametrów.
(2.6) Opcje
Dodatkową możliwość konfiguracji interpretera zapewniają opcje. Można je ustawić podając
odpowiednie argumenty przy wywołaniu powłoki albo w trakcie jej działania posłużyć się
poleceniem:
set -o [opcja ...]
Polecenie wydane bez argumentów wypisuje aktualne ustawienia poszczególnych opcji.
Usuwanie opcji umożliwia polecenie:
set +o [opcja ...]
Większość opcji ma swoje jednoliterowe odpowiedniki, których można użyć przy uruchamianiu
powłoki. Niektóre opcje są domyślnie ustawiane przez powłokę. W tablicy 4.4 podano nazwy, skróty
literowe oraz znaczenie wybranych opcji:
Tablica 4.4 Wybrane opcje powłoki bash
Nazwa opcji Znaczenie
(skrót literowy)
Informatyka 3 - Systemy operacyjne - Lekcja 4
history Powłoka udostępnia mechanizm historii. W powłokach interaktywnych
jest ustawiona domyślnie.
ignoreeof Ignorowanie przez powłokę znaku końca pliku (ctrl d).
monitor (-m) Powłoka udostępnia sterowanie pracami.
noclobber (-C) Powłoka nie nadpisuje istniejących plików w wyniku przekierowania
strumieni (>, >&). Można wymusić nadpisanie poprzez użycie >!.
notify (-b) Powłoka natychmiast informuje o zakończeniu procesu w tle. Gdy opcja
nie jest ustawiona, wypisuje informacje po wydaniu następnego polecenia.
noglob (-f) Powłoka nie rozwija nazw plików zawierających znaki specjalne.
emacs Powłoka używa stylu edytora emacs do edycji linii poleceń. Dopuszczane
jest przemieszczanie się kursorami i wstawianie znaków.
vi Powłoka używa stylu edytora vi do edycji linii poleceń. Opcja ta wyklucza
się wzajemnie z opcją emacs.
xtrace (-x) Powłoka wypisuje każde polecenie w postaci rozwiniętej przed jego
wykonaniem. Umożliwia w ten sposób śledzenie wykonywania poleceń.
Następny segment
Informatyka 3 - Systemy operacyjne - Lekcja 4
3. Interpretacja znaków specjalnych przez powłokę
(3.1) Rozwijanie nazw plików
Każdy interpreter dopuszcza stosowanie w nazwach plików specjalnych znaków, które mogą
zastępować jeden lub więcej dowolnych znaków. Otrzymuje się w ten sposób wzorce pasujące do
nazw kilku plików. Poniżej przedstawiono zestaw znaków specjalnych powłoki bash:
?- 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ład.
ls *.[hc]
(3.2) Cytowanie
Cytowanie stosowane jest w celu usunięcia specjalnego znaczenia niektórych znaków i słów.
Zapobiega interpretacji tych znaków przez powłokę, przywracając ich podstawowe znaczenie.
Niektóre sposoby cytowania dopuszczają pewne wyjątki:
\ - 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ład.
echo "`date` $pwd"
(3.3) Grupowanie poleceń
Interpreter umożliwia jednoczesne wydanie kilku poleceń w jeden linii. Sposób zgrupowania
zdecyduje o tym, w jaki sposób i w jakiej kolejności powloka wykona te polecenia. Poniżej
przedstawiono kilka możliwości połączenia poleceń w jednej linii oraz efekty takiego użycia (skrót
cmd oznacza dowolne polecenie):
cmd ; cmd ; cmd - powłoka grupuje polecenia na pierwszym planie wykonując je
sekwencyjnie,
cmd & cmd & cmd & - powłoka grupuje polecenia w tle wykonując je asynchronicznie,
cmd | cmd | cmd - powłoka grupuje polecenia wykonując je w potoku,
Informatyka 3 - Systemy operacyjne - Lekcja 4
(cmd ; cmd) - powłoka grupuje polecenia i wykonuje w nowej powłoce,
{ cmd ; cmd ; } - 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.
(3.4) Przekierowanie strumieni
Powłoka związuje z każdym tworzonym procesem trzy strumienie danych:
1. standardowy strumień wejciowy stdin,
2. standardowy strumień wyjciowy stdout,
3. standardowy strumień błędów (diagnostyczny) stderror.
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.
Przed wykonaniem dowolnego polecenia można zmienić domyślne przywiązanie strumieni, czyli
przekierować wejście i wyjście z polecenia. Przekierowania strumieni w powłoce bash obejmują
następujące operacje:
[d]
deskryptorem d; jeżeli d zostało pominięte przyjmowane jest 0,
[d]>plik - przekierowanie wyjścia powoduje otwarcie pliku do pisania z deskryptorem
d; jeżeli d zostało pominięte przyjmowane jest 1,
[d]>>plik - przekierowanie wyjścia powoduje otwarcie pliku do dopisywania z
deskryptorem d; jeżeli d zostało pominięte, przyjmowane jest 1,
[d]<>plik - przekierowanie powoduje otwarcie pliku do czytania i pisania z
deskryptorem d,
&>plik lub >&plik - przekierowanie powoduje skierowanie strumienia wyjściowego i strumienia
błędów do tego samego pliku,
[d1]>&d2 - przekierowanie powoduje zduplikowanie deskryptora pliku wyjściowego;
deskryptor d1 staje się kopią deskryptora d2 i wskazuje na ten sam plik.
Jeżeli numer deskryptora d zostanie pominięty, to powłoka domyślnie przyjmie deskryptor 0 (stdin)
lub 1 (stdout) w zależności od rodzaju przekierowania.
Operatory przekierowania można umieścić w linii polecenia zarówno przed jak i za poleceniem.
Przekierowania wykonywane są w kolejnosci występowania licząc od lewej do prawej.
(3.5) Inne
Interpreter korzysta jeszcze z kilku innych znaków specjalnych, które zostały już wprowadzone we
wcześniejszej części tego podręcznika Dla przypomnienia przytaczamy je również w tym miejscu:
Informatyka 3 - Systemy operacyjne - Lekcja 4
spacja, tabulator, znak nowej linii - separatory rozdzielające poszczególne elementy polecenia,
~ - katalog domowy użytkownika,
$ - podstawienie wartości parametru (zmiennej),
! - odwołanie do mechanizmu historii.
Następny segment
Informatyka 3 - Systemy operacyjne - Lekcja 4
4. Skrypty
Plik tekstowy zawierający listę poleceń dla interpretera nosi nazwę skryptu. Skrypty tworzone są w
celu ułatwienia użytkownikom pracy z interpreterem. Umożliwiają zapisanie często używanych
sekwencji poleceń i zastąpienie ich jednym poleceniem uruchomienia skryptu. Są szczególnie
przydatne dla administratora systemu, który wielokrotnie wykonuje powtarzające się czynnosci,
takie jak zakładanie kont nowym użytkownikom, tworzenie kopii zapasowych.
Skrypt może zawierać:
odwołania do zmiennych,
wbudowane polecenia interpretera,
pętle sterujące,
wywołania programów i innych skryptów,
komentarze.
Wszystkie linie rozpoczynających się od znaku #, traktowane są przez powłokę jako komentarz i w
związku z tym są ignorowane.
(4.1) Argumenty wywołania
Argumenty wywołania skryptu przekazywane są do powłoki jako parametry pozycyjne. Parametr $0
zawsze wskazuje nazwę skryptu, zaś parametry $1, $2, ... przechowują kolejne argumenty. Nazwa
skryptu nie podlega przesunięciu w wyniku działania polecenia shift.
(4.2) Metody uruchamiania skryptów
Skrypt zawiera listę poleceń, które powinień wykonać interpreter. Istnieje kilka sposobów
uruchomienia skryptu.
Naturalnym sposobem jest jawne wywołanie nowego interpretera z pierwszym argumentem w
postaci nazwy skryptu:
sh skrypt arg ...
bash skrypt arg ...
Wygodniej jest jednak posługiwać się wyłącznie nazwą skryptu jako nazwą nowego polecenia. W
tym celu należy wcześniej ustawić prawo wykonywania skryptu:
chmod +x skrypt
skrypt arg ...
Powstaje problem wyboru interpretera, który wykona skrypt. A wybór ten nie jest dowolny, gdyż
każda powłoka stosuje inną składnię. Domyślnie uruchamiana jest powłoka sh. Użytkownik może
wskazać dowolny interpreter umieszczając jego pełną nazwę ścieżkową w pierwszej linii skryptu po
.
np.: #!/bin/bash
znakach #!,
Informatyka 3 - Systemy operacyjne - Lekcja 4
W obydwu powyższych przypadkach uruchamiany jest nowy proces interpretera, który wykonuje
polecenia zawarte w skrypcie, po czym kończy swoje działanie. Sterowanie wraca do procesu
interpretera, w którym wydano polecenie. Nie są w nim widoczne zmiany dokonane w skrypcie
takie, jak modyfikacja zmiennych czy zmiana bieżącego katalogu.
Skrypt może być również wykonany przez bieżący interpreter i wtedy wszystkie zmiany pozostają
widoczne po zakończeniu skryptu. Służy do tego polecenie . (w powłokach sh i bash)) lub source (w
powłoce bash):
. skrypt arg ...
source skrypt arg ...
Typowym zastosowaniem tej metody jest ponowne odczytanie plików konfiguracyjnych powłoki po
wprowadzeniu modyfikacji, np:
. .bashrc
source .cshrc
Skrypt można wreszcie uruchomić zamiast bieżącego interpretera, posługując się poleceniem exec:
exec skrypt arg ...
W tym przypadku proces interpretera, który ma wykonać skrypt, zastępuje bieżący interpreter. Po
zakończeniu działania skryptu nie istnieje już proces, w którym wydano polecenie. Sterowanie
przechodzi więc do procesu nadrzędnego (macierzystego) lub następuje wylogowanie z systemu.
Następny segment
Informatyka 3 - Systemy operacyjne - Lekcja 4
5. Programowanie w języku powłoki
(5.1) Pętle i polecenia sterujące
Zestaw złożonych poleceń powłoki bash obejmuje większość typowych pętli i poleceń sterujących.
Pętla for 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.
in
for zmienna [ słowo ...]
do lista_poleceń
done
Pętla for może przyjąć również drugą postać, w której:
wyrażenie1 określa warunek początkowy i obliczane jest tylko raz przed pierwszą iteracją
pętli,
wyrażenie2 pełni rolę warunku zakończenia pętli i obliczane jest na początku każdej iteracji
dopóki nie osiągnie wartość zerowej,
wyrażenie3 obliczane jest w każdej iteracji pętli po wykonaniu listy poleceń.
for ((wyrażenie1; wyrażenie2; wyrażenie3))
do lista_poleceń
done
Pętla while wykonywana jest dopóki ostatnie polecenie z listy warunków zwraca status zerowy.
while lista_warunków
do lista_poleceń
done
Pętla until wykonywana jest dopóki ostatnie polecenie z listy warunków zwraca status niezerowy.
until lista_warunków
do lista_poleceń
done
Polecenie case stara się dopasować słowo kolejno do każdego wzorca i wykonuje listę poleceń
związaną z pierwszym pasującym wzorcem.
in
case słowo
wzorzec [|wzorzec] ...) lista_poleceń;;
...
esac
W poleceniu if wykonywana jest gałąz, dla której ostatnie polecenie z listy warunków zwraca status
zerowy.
if lista_warunków
Informatyka 3 - Systemy operacyjne - Lekcja 4
then lista_poleceń
[ lista_warunków
elif
then lista_poleceń]
...
[ lista_poleceń]
else
fi
Pętle for, while i until mogą być przerywane za pomocą poleceń: break [n] i continue [n]
Polecenie break przerywa wykonywanie pętli. Polecenie continue przerywa wykonywanie bieżącej
iteracji pętli i wznawia następną iterację. Obydwa polecenia przerywają n poziomów
zagnieżdżonych pętli, gdy podany jest argument. Domyślnie przyjmowane jest n=1.
Zakończenie działania powłoki umożliwia polecenie: exit [status] Argument oznacza status
zakończenia zwracany przez powłokę. Domyślnie zwracany jest status zerowy.
(5.2) Sprawdzanie warunków
Polecenia sterujące if, while i until wykorzystują jako warunek działania status zakończenia innego
polecenia. Może to być dowolne polecenie systemu Linux. Najczęściej najbardziej praktyczne
okazuje się klasyczne sprawdzenie jakiegoś warunku np. porównanie dwóch liczb lub ciągów
znaków. Takich możliwości dostarcza wbudowany w powłokę mechanizm sprawdzania warunków:
[[ warunek ]]
oraz polecenie test, które można wywołać na dwa sposoby;
test warunek
[ warunek ]
We wszystkich przypadkach składnia specyfikowania warunku jest podobna. Istnieje możliwość
sprawdzania atrybutów plików, porównywania ciągów znaków i liczb całkowitych. Liczby
rzeczywiste traktowane są jak ciągi znaków.
Testowanie atrybutów pliku wygląda następująco:
-r plik - sprawdza, czy użytkownik posiada prawo do czytania,
-w plik - sprawdza, czy użytkownik posiada prawo do pisania,
-x plik - sprawdza, czy użytkownik posiada prawo do wykonywania,
-f plik - sprawdza, czy plik to plik zwykły,
-d plik - sprawdza, czy to katalog,
plik
-c plik - sprawdza, czy plik to plik specjalny znakowy,
-b plik - sprawdza, czy plik to plik specjalny blokowy,
-p plik - sprawdza, czy plik to plik FIFO,
-s plik - sprawdza, czy plik to plik o niezerowej długości.
Informatyka 3 - Systemy operacyjne - Lekcja 4
Przykład
Sprawdzanie, czy użytkownik posiada prawo pisania w katalogu dir.
if [ -w dir ]
then
mkdir nowy_katalog
fi
Testowanie ciągów znaków wygląda następująco:
s1
- sprawdza, czy ciąg jest niezerowy,
s1 = s2 - sprawdza, czy ciągi są identyczne,
s1 != s2 - sprawdza, czy ciągi są różne.
Przykład
Sprawdzanie, czy bieżącym katalogiem jest katalog domowy użytkownika.
if [ $pwd=$HOME ]
then
mkdir nowy_katalog
fi
Porównywanie liczb całkowitych umożliwiają operatory:
n1 -eq n2 - sprawdza czy n1 = n2,
n1 -ne n2 - sprawdza czy n1 >< n2,
n1 -gt n2 - sprawdza czy n1 > n2,
n1 -ge n2 - sprawdza czy n1 >= n2,
n1 -lt n2 - sprawdza czy n1 < n2,
n1 -le n2 - sprawdza czy n1 <= n2.
Przykład
Wypisywanie kolejno argumentów wywołania skryptu.
while [ $# -gt 0 ]
do
echo $1
shift
done
Warunki można ze sobą łączyć korzystając z następujących operatorów logicznych:
-a - operator AND,
-o - operator OR,
Informatyka 3 - Systemy operacyjne - Lekcja 4
( ) - grupowanie warunków.
(5.3) Operacje arytmetyczne
Niektóre interpretery, jak sh i csh, nie mają wbudowanych żadnych operacji arytmetycznych.
Powłoka bash udostępnia możliwość rozwijania wyrażeń arytmetycznych bezpośrednio w
poleceniach:
$((wyrażenie))
oraz poprzez wbudowane polecenie let:
let wyrażenie [wyrażenie ...]
Każdy argument polecenia let traktowany jest jako oddzielne wyrażenie, które należy niezależnie
obliczyć. Wyrażenie może zawierać jedynie argumenty całkowite i operatory. Zestaw dostępnych
operatorów oraz priorytety poprzedzania są identyczne jak w języku C. Poniżej przedstawiamy
wybrane operatory, zaś pełną listę można znalezć w dokumentacji elektronicznej lub w literaturze.
Wybrane operatory przedstawiono w tablicy 4.5:
Tablica 4.5 Operatory polecenia let
Kategoria operatorów Operatory
arytmetyczne ++, --, **, *, / , %, -, +
logiczne !, &&, ||
bitowe ~, <<, >>, &, ^, |
podstawienia =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
porównania <=, >=, <, >, ==, !=
Przykład
Obliczenia z wykorzystaniem poleceń powłoki .
bash
[apw@venus]$ let x=5*6
[apw@venus]$ echo $x
30
[apw@venus]$ echo $((x=7*8))
56
[apw@venus]$ echo $x
56
Do przeprowadzenia operacji obliczeniowych można również wykorzystać program expr
uruchamiany w następujący sposób:
expr arg1 operator arg2 ...
Program oblicza wartość podanego wyrażenia i wysyła do stdout. Podstawienia można dokonać
Informatyka 3 - Systemy operacyjne - Lekcja 4
niezależnie w powłoce:
zmienna=`expr wyrażenie`
Wszystkie argumenty i operatory w wyrażeniu muszą być rozdzielone znakami spacji. Operatory
można podzielić na trzy grupy (tablica 4.6):
Tablica 4.6 Operatory polecenia expr
Kategoria operatorów Operatory
arytmetyczne +, -, \*, /, %
porównania =, !=, \>, \>=, \<, \<=
dopasowania :
Niektóre operatory (np. *) są znakami specjalnymi i mogą zostać przedwcześnie zinterpretowane
przez powłokę zamiast przez program expr. W związku z tym powinny być poprzedzone znakiem \,
aby przekazać je bezpiecznie do programu expr. Operatory arytmetyczne działają na liczbach
całkowitych. Operatory porównania zapewniają porównanie arytmetyczne liczb całkowitych lub
porównanie leksykalne innych argumentów. Operator : umożliwia sprawdzenie ile znaków z
podanego ciągu pasuje do wzorca:
string : wzorzec
Wzorzec może zawierać znaki specjalne. Zestaw dostępnych znaków specjalne jest taki jak dla
programu grep.
Przykład
Wykorzystanie polecenia do wykonywania obliczeń.
expr
x=`expr $x + 1
Wykorzystanie operatora polecenia .
: expr
expr $1 : '.*'
expr $1 : '[0-9]*'
(5.4) Operacje wejścia/wyjścia
Powłoka bash umożliwia wczytywanie danych ze strumienia wejściowego i wypisywanie
komunikatów do strumienia wyjściowego.
read [opcje] [zmienna ...]
Polecenie read odczytuje jedną linię ze strumienia wejściowego stdin. Następnie dokonuje podziału
na wyrazy, stosując separatory zdefiniowane w zmiennej IFS i przypisuje kolejne wyrazy zmiennym
podanym na liście argumentów.
echo [opcje] [arg ...]
Polecenie echo przesyła na standardowe wyjście stdout argumenty rozdzielone znakiem spacji.
Argumentem może być dowolny ciąg znaków, zawierający również znaki specjalne powłoki, np.
odwołania do zmiennych.
Informatyka 3 - Systemy operacyjne - Lekcja 4
printf format [arg ...]
Polecenie printf wypisuje argumenty na standardowym wyjściu zgodnie z podanym formatem.
Sposób formatowania jest identyczny jak w przypadku funkcji printf() języka C.
(5.5) Funkcje
Interpreter umożliwia definiowanie własnych funkcji:
[function] nazwa () {lista_poleceń;}
Odwołanie do funkcji następuje przez nazwę, podobnie jak do wszystkich poleceń. Funkcje są
zawsze wykonywane przez bieżącą powłokę. Argumenty wywołania funkcji zostają ustawione jako
parametry pozycyjne powłoki wyłącznie na okres wykonywania funkcji.
Przykład
Zdefiniowana poniżej funkcja wyświetla informacje o poprawnym wywołaniu
skryptu
usage()
{
echo "Poprawne wywolanie to : nazwa_skryptu arg1 op1 arg2 ... "
echo "\nWywolania,operatory i realizowane dzialania "
echo "Dodawanie np: 2 + 3 "
echo "Odejmowanie np: 4 - 5 "
echo "Dzielenie np: 4 / 2 "
echo "Mnozenie np: 4 * 4 "
echo "Potegowanie np: 4 \^ 4"
exit
}
Następny segment
Informatyka 3 - Systemy operacyjne - Lekcja 4
6. Filtry
Filtry to grupa programów służących do wyszukiwania wzorców i/lub przetwarzania plików
tekstowych. Programy te są bardzo często wykorzystywane do tworzenia poleceń i aliasów powłoki,
skrytów instalacyjnych oraz skryptów przeznaczonych do wykonywania złożonych zadań
administracyjnych. Nie jest to jedyne zastosowanie filtrów, gdyż przydatne mogą być one wszędzie
tam gdzie zachodzi konieczność nietrywialnego wyszukiwania danych w dużej liczbie plików lub w
plikach o bardzo dużej objętości (często okoliczności te występują jednocześnie) - na przykład w
zastosowaniach inżynierskich do przetwarzania wyników symulacji do postaci umożliwiającej
wykonania żądanych zestawień i wykresów.
(6.1) Program grep
Program grep poszukuje w standardowym strumieniu wejściowym lub w plikach wejściowych
wierszy, które pasują do podanego wzorca. Każdy znaleziony wiersz jest przesyłany w całości na
standardowy strumień wyjściowy, o ile nie zastosowano opcji zmieniającej to zachowanie.
Wzorzec ma postać dowolnego wyrażenia, w którym mogą wystąpić znaki specjalne. Postać
wywołania programu jest następująca:
grep [opcje] wzorzec [plik]...
gdzie:
wzorzec - wyrażenie opisujące poszukiwany wzorzec,
plik - nazwa pliku wejściowego - jeśli pominięta grep czyta dane ze strumienia wejściowego,
opcje - lista wybranych opcji .
Znaki specjalne rozpoznawane przez program grep pokazane w tablicy 4.7:
Tablica 4.7 Znaki specjalne programu grep
Znak Znaczenie
^ Początek wiersza.
$ Koniec wiersza.
. Jeden dowolny znak.
* 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.
Jak widać są to znaki, które są również znakami specjalnymi powłoki. Jeśli wyrażenie opisujące
wzorzec zawiera takie znaki to powinno zostać umieszczone w apostrofach, np.:
ls * | grep '^[Z].[a-d]*graf\.c$'
.
W ten sposób powłoka nie dokona interpretacji tekstu wzorca i zostanie ono przekazany w
Informatyka 3 - Systemy operacyjne - Lekcja 4
oryginalnej postaci programowi grep.
Najczęściej stosowane opcje programu grep to:
-c - podaje tylko liczbę dopasowanych linii,
-n - dopisuje numer przed każdą dopasowaną linią,
-v - wypisuje tylko te linie, które nie pasują do wzorca.
Dostępne są też dwie odmiany programu grep: fgrep i egrep.
Program fgrep dopuszcza stosowanie tylko uproszczonych wzorców, które nie zawierają żadnych
znaków specjalnych. Inaczej mówiąc wzorzec jest dokładnie takim tekstem jakiego poszukujemy w
danych wejściowych, np.:
ps -ef | fgrep inetd
W przypadku programu egrep stosować można wzroce o rozszerzonym zakresie znaków
specjlanych. Niektóre dodatkowe znaki specjalne pokazano w tablicy 4.8:
Tablica 4.8 Dodatkowe znaki specjalne programu
egrep
Znak Znaczenie
+
Liczba wystąpień poprzedzającego wyrażenia > 1.
?
Liczba wystąpień poprzedzającego wyrażenia = 0 lub 1.
{n}
Poprzedzające wyrażenie powtarza się dokładnie n razy.
(6.2) Edytor strumieniowy sed
Program sed służy do edycji strumieni danych. Znajduje zastosowanie przy tworzeniu filtrów do
przetwarzania wsadowego, przy edycji dużych plików, które nie mieszczą się w buforze, przy
przetwarzaniu potokowym oraz w skryptach shellowych.
Edytor sed przesyła strumień wejściowy lub zawartość plików wejściowych do strumienia
wyjściowego, wykonując operacje edycyjne kolejno na każdej linii, zgodnie z podanym programem.
Program zawiera polecenia, poprzedzone adresami linii wejściowych, do których powinny być
zastosowane. Edytor kolejno kopiuje jedną linię do przestrzeni roboczej (do bufora roboczego)
i stosuje do niej sekwencję tych poleceń, których adresy wskazują daną linię. Następnie przesyła
linię do strumienia wyjściowego oraz czyści bufor roboczy. Niektóre polecenia wykorzystują bufor
pomocniczy do zapamiętywania fragmentów tekstu.
Wywołanie programu sed może przybrać jedną z następujących postaci:
sed [-n] 'program' [plik_danych ...]
sed [-n] -e 'program' [-e 'program']... [-f
plik_z_programem]... [plik_danych...]
sed [-n] -f plik-z-programem [-f plik_z_programem]... [-e
Informatyka 3 - Systemy operacyjne - Lekcja 4
'program']... [plik_danych...]
gdzie:
program - program opisujący operacje edycyjne,
-e 'program' - pobranie programu z linii polecenia,
znaki ' ' zabezpieczają przed interpretacją elementów programu przez
powłokę shell,
-f - pobranie programu z pliku plik_z_programem,
plik_z_programem
plik_danych - plik wejściowy - jeśli pominięty to sed czyta dane ze strumienia
wejściowego,
-n - przesyła na wyjście tylko wskazane w programie linie.
Program musi być wywołany przynajmniej z jedną opcją -e lub -f. Pojedyńczą opcję -e można
pominąć, podając jedynie program.
Program dla edytora sed składa się z linii zawierających adres oraz polecenie z argumentami lub
zestaw poleceń. Każda linia może przyjąć jedną z następujących postaci:
[adres] polecenie [argumenty]
[adres] {
lista poleceń
}
Polecenia wykonywane są w kolejności występowania w programie. Kolejność tę można zmienić
poprzez wykonanie skoku do etykiety.
Polecenie może być poprzedzone 1 lub 2 adresami lub też pozbawione adresu .
Polecenie z jednym adresem stosowane jest do linii wskazanych przez adres.
Polecenie z dwoma adresami stosowane jest do zakresu ograniczonego liniami wskazanymi przez
adresy.
Polecenie bez adresu stosowane jest do każdej linii wejściowej.
Adresowanie linii może odbywać się poprzez podanie numeru linii (adres numeryczny) lub przez
podanie jej kontekstu (adres kontekstowy). Adresy numeryczne są podawane w postaci:
[nr1[, nr2]]
a adresy kontekstowe jako:
[/wzorzec[/][, /wzorzec[/]]
Adresy numeryczne są więc parą liczb całkowitych dodatnich lub jest to jedna taka liczba. Program
sed korzysta z własnego licznika linii, który kumuluje ich liczbę dla wszystkich plików wejściowych
łącznie. Znak $ identyfikuje ostatnią linię w ostatnim pliku.
Adresy kontekstowe mają postać wzorca ograniczonego dwoma identycznymi znakami: /wzorzec/
lub \znak wzorzec znak Wzorzec jest dowolnym wyrażeniem, w którym mogą wystąpić znaki
Informatyka 3 - Systemy operacyjne - Lekcja 4
specjalne. Edytor rozpoznaje następujące znaki (tablica 4.9):
Tablica 4.9 Znaki specjalne programu sed
Znak Znaczenie
^
Początek linii.
$
Koniec linii.
\n
Znak nowej linii z wyjątkiem ostatniego znaku w buforze.
.
Jeden dowolny znak.
*
Dowolna liczba wystąpień poprzedzającego wyrażenia.
[ ]
Jeden dowolny znak z listy zawartej wewnątrz nawiasów.
[ - ]
Jeden dowolny znak z zakresu podanego wewnątrz nawiasów.
[^...]
Jeden dowolny znak z wyjątkiem tych, podanych wewnątrz nawiasów oraz
kończącego bufor znaku nowej linii.
\
Przywraca pierwotne znaczenie następnego znaku.
\( \)
Określa pole, do którego można odwołać się poprzez numer.
\nr
Odwołanie do pola o numerze nr (nr = 0 - 9).
Polecenia edytora sed można podzielić na trzy grupy:
1. polecenia edycyjne,
2. polecenia wejścia/wyjścia,
3. polecenia sterujące.
Polecenia te są zgromadzone w tablicach 4.10, 4.11 i 4.12.
Tablica 4.10 Polecenia edycyjne programu sed
Polecenie Opis
[adres]d
Usuwanie wskazanych linii.
[adres]n
Wczytanie do przestrzeni roboczej kolejnej linii.
Bieżąca linia jest przesyłana na stdout.
[adres]a \[RETURN]
Wstawianie podanego tekstu za wskazaną linią
text (konieczne jest zastosowanie znaku przejścia do
nowego wiersza [RETURN]).
[adres]i \[RETURN]
Wstawianie podanego tekstu przed wskazaną linią
text
(konieczne jest zastosowanie znaku przejścia do
nowego wiersza [RETURN]).
[adres]c \[RETURN]
Wstawianie podanego tekstu zamiast wskazanych
text
linii (konieczne jest zastosowanie znaku przejścia
do nowego wiersza [RETURN]).
[adres]s/wzorzec/tekst/flagi
Zamiana fragmentu linii, który pasuje do wzorca
na podany tekst (zamiast znaków // mogą być
użyte dowolne inne).
Informatyka 3 - Systemy operacyjne - Lekcja 4
wzorzec
Wyrażenie specjalne, które może zawierać znaki
specjalne.
tekst
Ciąg znaków, w którym można zastosować
symbole & i \d:
& - będzie zawierał napis pasujący do
wzorca,
\d - będzie zawierał podstring numer d
pasujący do fragmentu wzorca pomiędzy
znakami \( \).
flagi
Opcje dla polecenia zamiany:
n - zamienia n wystąpień, n = 1 - 512,
g - zamienia globalnie wszystkie
wystąpienia wzorca,
p - przesyła linię na wyjście, jeśli nastąpiła
zamiana,
w plik - przesyła linię do pliku plik, jeśli
nastąpiła zamiana.
Tablica 4.11 Polecenia wejścia/wyjścia programu sed
Polecenie Opis
[adres]p
Przesłanie wskazanych linii na stdout.
[adres]=
Przesłanie numerów wskazanych linii na stdout.
[adres]w plik
Zapisanie wskazanych linii do pliku.
[adres]r plik
Wstawienie zawartości pliku za wskazaną linią.
Tablica 4.12 Polecenia sterujące programu sed
Polecenie Opis
[adres]! funkcja
Zastosowanie podanej funkcji tylko do linii nie wybranych przez
adres.
[adres]{ polecenia }
Grupowanie poleceń.
: etykieta
Ustawienie etykiety.
[adres]b etykieta
Skok do etykiety lub na koniec programu, gdy jej brak.
[adres]t etykieta
Skok do etykiety, jeśli nastąpiły jakieś zmiany w bieżącej linii.
#
Linia komentarza.
#n
Jeśli występuje w pierwszej linii programu, wyłącza standardowe
Informatyka 3 - Systemy operacyjne - Lekcja 4
przesyłanie na stdout.
[adres]q
Skok na koniec programu i zakończenie jego działania.
Przykłady
Polecenie wyszukujące w pliku wejściowym linie zaczynające się od
dwukrotnego wystąpienia dowolnego wzorca (rozdzielonych spacją):
sed -n '/^\(.*\) \1/p' plik
Polecenie wypisujące zawartość pliku zamieniając wystąpienia wzorca tekst1 na
wzorzec tekst2:
sed 's/tekst1/tekst2/g' plik
(6.3) Procesor tekstu awk
Awk jest językiem programowania przeznaczonym do przetwarzania tekstów. Stosowany jest do
generowania raportów, wyszukiwania wzorców, filtrowania i formatowania danych przesyłanych
innym programom. Oprócz podstawowej wersji awk istnieją również implementacje nazywane
nawk i gawk o rozszerzonych możliwościach. Szczegółowe informacje o programie [ng]awk
dostępnym w danym systemie można uzyskać dzięki poleceniu man. W dalszej części lekcji
przekazane zostaną podstawowe informacje o posługiwaniu się programem awk.
Awk przetwarza zawartość strumienia wejściowego lub kolejnych plików wejściowych zgodnie z
podanym programem. Program zawiera wzorce oraz związane z nimi akcje, które należy wykonać
na danych wejściowych pasujących do wzorców. Zawartość każdego pliku wejściowego jest
przeglądana jednokrotnie. Wywołanie programu awk może przyjmować dwie formy:
awk [-Fseparator_pola] 'program' [[-v] zmienna=wartość]...
[plik]...
awk [-Fseparator_pola] -f plik_z_programem [[-v]
zmienna=wartość]... [plik]...
gdzie:
program - program zawierający polecenia awk; znaki ' ' zapobiegają interpretacji
przez powłokę shell,
-f - pobranie programu z pliku,
plik_z_programem
-Fseparator_pola - ustawienie znaku separator_pola jako separatora pola w rekordzie,
plik - plik wejściowy zawierający tekst do przetworzenia,
[-v] - nadanie wartości zmiennej, która będzie dostępna w głównym module
zmienna=wartość programu;
opcja -v udostępnia zmienną w module inicjującym.
Polecenie awk może być zastosowane na trzy różne sposoby:
Informatyka 3 - Systemy operacyjne - Lekcja 4
1. przez wywołanie awk wraz z programem w linii polecenia,
2. przez wywołanie awk w linii polecenia, program umieszczony w pliku,
3. przez wywołanie awk wraz z programem umieszczone w skrypcie shella.
Pierwszy sposób stosuje się w przypadku krótkich programów (jedna lub dwie linie), które nie będą
często wykorzystywane. Programy dłuższe lub przeznaczone do częstego użytkowania umieszcza się
na ogół w pliku. Najczęściej stosowany jest trzeci sposób.
Program awk przetwarza dane wejściowe według następującego algorytmu. Dane wejściowe
dzielone są na rekordy zgodnie z występowaniem separatorów rekordu. Standardowo jest to znak
nowego wiersza, ale można zmienić to ustawienie, przypisując inne znaki zmiennej RS. Awk
wczytuje kolejno po jednym rekordzie do przestrzeni roboczej i dokonuje podziału na pola zgodnie z
rozmieszczeniem separatorów pola. Zazwyczaj są to znaki spacji i tabulacji, lub inne ustawione w
zmiennej FS lub w linii wywołania przez opcję -Fseparator_pola. Do poszczególnych pól można
się odwoływać poprzez następujące zmienne:
$0
- cały bieżący rekord,
$1, $2 ... - kolejne pola bieżącego rekordu,
$NF
- ostatnie pole bieżącego rekordu.
Dodatkowo zdefiniowane są zmienne:
NF - liczba pól bieżącego rekordu,
NR - liczba dotychczas wczytanych rekordów,
FNR - liczba rekordów wczytanych z bieżącego pliku,
Bieżący rekord porównywany jest kolejno ze wszystkimi wzorcami w programie. W przypadku
dopasowania wykonywane są akcje związane z danym wzorcem. Po wykonaniu całego programu
następuje usunięcie rekordu z przestrzeni roboczej i wczytanie nowego. Program dla awk jest
sekwencją instrukcji o następującej postaci:
wzorzec { akcja }
lub
wzorzec { blok akcji }
Poszczególne akcje w bloku mogą być oddzielone średnikiem lub znakiem nowego wiersza.
Pominięcie wzorca w instrukcji powoduje zastosowanie akcji do wszystkich rekordów wejściowych.
Pominięcie akcji powoduje przesłanie wszystkich pasujących rekordów do strumienia wyjściowego.
W programie można również umieścić linie komentarza rozpoczynające się znakiem #.
Pole wzorzec określa, czy związana z nim akcja ma zostać zastosowana do bieżącego rekordu.
W programie można stosować trzy typy wzorców:
wzorce specjalne BEGIN i END,
izolowane wyrażenia specjalne,
wyrażenia wartościowane jako prawda lub fałsz.
Informatyka 3 - Systemy operacyjne - Lekcja 4
W przypadku zastosowania konstrukcji BEGIN { akcja } akcja wykonywana jest na początku,
jeszcze przed rozpoczęciem przetwarzania danych wejściowych. Daje to możliwość inicjalizacji
zmiennych (np. separatorów rekordu RS i pola FS) lub wypisania nagłówków w raporcie.
W przypadku użycia konstrukcji END { akcja } akcja związanawykonywana jest po zakończeniu
przetwarzania danych wejściowych. Umożliwia to np. umieszczenie podsumowania w raporcie.
Jeśki zastosujemy konstrukcję /wzorzec/ { akcja } to wzorzec może mieć postać izolowanego
wyrażenia ze znakami specjalnymi, umieszczonego pomiędzy znakami / /.
Polecenie awk akceptuje następujący zestaw znaków specjalnych (tablica 4.13):
Tablica 4.13 Znaki specjalne programu awk
Znak Znaczenie
^
Początek wiersza.
$
Koniec wiersza.
\n
Znak nowego wiersza z wyjątkiem ostatniego znaku w buforze.
.
Jeden dowolny znak.
*
Zero lub więcej wystąpień poprzedzającego wyrażenia.
+
Jedno lub więcej wystąpień poprzedzającego wyrażenia.
?
Zero lub jedno wystąpienie poprzedzającego wyrażenia.
|
Jeden znak z pary.
[ ]
Jeden dowolny znak z listy zawartej wewnątrz nawiasów.
[ - ]
Jeden dowolny znak z zakresu podanego wewnątrz nawiasów.
[^...]
Jeden dowolny znak z wyjątkiem tych, podanych wewnątrz nawiasów oraz kończącego
bufor znaku nowej linii.
\
Przywraca pierwotne znaczenie następnego znaku.
W ogólnym przypadku wzorzec przyjmuje postać dowolnego wyrażenia, któremu można przypisać
wartość logiczną prawda lub fałsz. Wyrażenie może zawierać znaki specjalne oraz dowolne
operatory. Najczęściej stosowane są operatory dopasowania wzorców np.:
string ~ /wzorzec/ { akcja }
string !~ /wzorzec/ { akcja }
oraz operatory relacji np.:
string1 == string2 { akcja }
liczba1 > liczba2 { akcja }
Blok akcji ma postać sekwencji poleceń wejściowych i wyjściowych, poleceń sterujacych oraz
operacji przypisania wartości zmiennym.
Informatyka 3 - Systemy operacyjne - Lekcja 4
W składni awk dostępne są następujące polecenia i pętle sterujące:
warunek blok1
if ( ) { } [ else { blok2 } ]
warunek blok
while ( ) { }
wyrażenie wyrażenie wyrażenie blok
for ( ; ; ) { }
zmienna tablica blok
for ( in ) { }
Wewnątrz bloków stosować można następujące instrukcje zmieniające wykonywanie pętli:
break - przerywa bieżący obieg pętli i rozpoczyna następny,
continue - przerywa bieżący obieg pętli i rozpoczyna go od początku,
next - przerywa wykonywanie programu dla bieżącego rekordu, wczytuje nowy rekord i
rozpoczyna przetwarzanie od początku programu,
exit - przerywa wykonywanie programu.
Operacje wejścia /wyjścia mogą być realizowane za pomocą następujących instrukcji:
print [wyrażenie][[,] wyrażenie]...
Wypisuje kolejne wyrażenia
rozdzielone wyjściowym
separatorem pola podanym w
zmiennej OFS; na końcu
umieszczany jest wyjściowy
separator rekordu pamiętany w
zmiennej ORS.
printf (format, wyrażenie [, wyrażenie] ...)
Formatuje i wypisuje wyrażenie
(składnia jak w języku C).
getline
Wczytuje kolejny rekord z
bieżącego pliku wejściowego
do przestrzeni roboczej.
getline zmienna
Wczytuje kolejny rekord z
bieżącego pliku wejściowego
do zmiennej, nie zmieniając
zawartości przestrzeni roboczej.
getline < plik
Wczytuje rekord z podanego
pliku do przestrzeni roboczej.
getline zmienna < plik
Wczytuje rekord z podanego
pliku do zmiennej, nie
zmieniając zawartości
przestrzeni roboczej.
system (polecenie shella)
Przekazuje polecenie do
wykonania w shellu; strumień
wyjściowy polecenia jest
włączany w strumień
wyjściowy awk.
Informatyka 3 - Systemy operacyjne - Lekcja 4
W składni awk dostępne są zmienne skalarne, tablicowe jednowymiarowe oraz stałe numeryczne
i tekstowe. Stałe tekstowe mają postać dowolnego napisu objętego znakami " ". Wartość zmiennej
może być interpretowana jako tekst lub wartość numeryczna. Wszystkie zmienne są inicjalizowane
napisem zerowym (wartość numeryczna 0). Operacja przypisania wartości zmiennej ma ogólną
postać:
zmienna operator wyrażenie
Listę dostępnych operatorów zamieszczono w tablicy 4.14.
W przypadku tablic nie deklaruje się ich rozmiaru ani typu elementów. Nowe elementy pojawiają się
w momencie pierwszego przypisania wartości. Indeksy tablicy mogą być dowolnymi napisami
(w szczególności kolejnymi liczbami całkowitymi).
Wyrażenia występują zarówno we wzorcach jak i w akcjach. Mogą zawierać odwołania do stałych,
zmiennych i do pól rekordów, wywołania funkcji oraz dowolne operatory spośród wymienionych
poniżej:
Tablica 4.14 Operatory dostępne w programach awk
Typ operatora Operator
+ , - , * , / , % , (...) , ^
arytmetyczne
= , += , -= , *= , /= , %= , ++ , --
przypisania
< , <= , == , != , > , >=
relacji
|| , && , ! , ?:
logiczne
~ , !~
porównywania wzorców
W programach awk można posługiwać się również predefiniowanymi funkcjami do operacji na
tekstach oraz funkcjami numerycznymi. Są one pokazane w tablicach 4.15 i 4.16.
Tablica 4.15 Funkcje awk do operacji na tekstach
Funkcja Opis działania
INDEX (s1, s2)
Zwraca indeks pierwszego
wystąpienia stringu s2 w
stringu s1 lub 0, jeśli
dopasowanie nie
następuje.
length (string)
Zwraca długość stringu.
match (string, wzorzec)
Zwraca indeks pierwszego
wystąpienia wzorca w
stringu lub 0, jeśli
dopasowanie nie
następuje.
split (string, tablica, separator)
Dzieli string na pola
(rozdzielone separatorami)
oraz przypisuje kolejnym
elementom tablicy;
funkcja zwraca liczbę pól.
Informatyka 3 - Systemy operacyjne - Lekcja 4
substr (string, pozycja, długość)
Zwraca podstring o
podanej długości,
rozpoczynający się od
wskazanej pozycji.
sprintf (format, wyrażenie [, wyrażenie]...)
Formatuje wyrażenie i
zwraca w postaci stringu.
sub(wzorzec, nowy_podstring [, string])
Zamienia pierwsze
wystąpienie wzorca w
danym stringu na nowy
podstring.
gsub(wzorzec, nowy_podstring [, string])
Zamienia wszystkie
wystąpienia wzorca w
danym stringu na nowy
podstring.
Tablica 4.16 Funkcje numeryczne awk
Funkcja Opis działania
atan2 (y,x)
arcus tangens y/x w radianach
cos (rad)
cosinus kąta rad
exp (x)
funkcja ex
int (x)
część całkowita x
log (x)
ogarytm naturalny z x
rand ()
generator liczb pseudolosowych z przedziału < 0, 1 >
srand ([seed])
inicjuje generator liczb pseudolosowych
sin (rad)
sinus kąta rad
sqrt (x)
pierwiastek kwadratowy z x
Oprócz funkcji standardowo dostępnych w awk użytkownik ma możliwość zdefiniowania własnych
funkcji zgodnie z następującą składnią:
function nazwa arg... ciało funkcji
( ) { }
Wewnątrz ciała fukcji można skorzystać z funkcji:
wyrażenie
return ( )
która zwraca wartość podanego wyrażenia.
W przypadku podania treści programu w wywołaniu polecenia awk, program umieszcza się w
znakach ' '. Zapobiega to interpretowaniu znaków specjalnych awk przez powłokę shell. W
niektórych przypadkach dopuszczenie do takiej interpretacji jest jednak konieczne, np. w celu
udostępnienia argumentów wywołania skryptu w programie awk. Dokonuje się tego poprzez
ograniczenie fragmentu programu, przeznaczonego do interpretacji, znakami ' '. Program zostaje w
ten sposób "rozcięty" na dwie części zabezpieczone znakami ' ' oraz wskazany fragment pomiędzy
nimi. Poniższy przykład ilustruje sposób pobrania wartości pierwszego argumentu wywołania
Informatyka 3 - Systemy operacyjne - Lekcja 4
skryptu:
awk ' ... '$1' ... '
Inną metodą jest rezygnacja z umieszczania całego programu pomiędzy znakami ' ' i zabezpieczanie
jedynie wybranych fragmentów. Może to być jednak bardziej pracochłonne.
Przykład.
Poniżej podano kilka prostych przykładów zastosowania awk. Zachęcamy do ich
przeanalizowania oraz praktycznego przetestowania ich działania.Pierwszy
przykład pokazuje zastosowanie awk do "odfiltrowania" zbędnych kolumn w
raporcie wypisywanym przez polecenie :
ps
ps -ef | awk 'BEGIN {print "Procesy uzytkownika:"}
$1 ~ /lab1$/ {print $2, $8}
END {print "Koniec"} '
Następne dwa polecenia wypisują zawartość pliku zamieniając wystąpienia
wzorca tekst1 na wzorzec tekst2
:
awk '{gsub("tekst1", "tekst2", $0); print $0}' plik
awk '{gsub("tekst1", "tekst2"); print}' plik
Następna lekcja
Wyszukiwarka
Podobne podstrony:
Informatyka 3 Systemy operacyjne Lekcja 9
Informatyka 3 Systemy operacyjne Lekcja 7
Informatyka 3 Systemy operacyjne Lekcja 1
Informatyka 3 Systemy operacyjne Lekcja 8
Informatyka 3 Systemy operacyjne Lekcja 2
Informatyka 3 Systemy operacyjne Lekcja 3
Informatyka 3 Systemy operacyjne Lekcja 3
Informatyka 3 Systemy operacyjne Lekcja 6
systemy operacyjne cw linux apache mysql
więcej podobnych podstron