STRUMIENIE_POTOKI.DOC

(105 KB) Pobierz
ADMINISTRACJA

1

 

                                                                        STRUMIENIE,POTOKI I FILTRY

 

Każdemu procesowi w Linuksie są przypisane trzy strumienie danych: wejściowy, wyjściowy i błędów. Każdy proces w momencie uruchamiania musi mieć określone miejsca, z których pobiera dane wejściowe, do których przekazuje dane będące efektem działania procesu i do których wysyła komunikaty o błędach.

Przykładowo proces: ls /var pobiera dane z katalogu /var, dane wyjściowe przekazuje na ekran monitora, a komunikaty o błędach też na ekran monitora.

Jak rezultat zalogowania się użytkownika w systemie zostaje uruchomiony przypisany mu interpreter poleceń systemowych (shell), czyli powłoka. W naszym przypadku jest to bash. Domyślnym strumieniem danych wejściowych dla bash-a jest klawiatura. Natomiast dane wyjściowe i komunikaty o błędach są przekazywane na ekran. Polecenia uruchamiane z linii poleceń bash-a dziedziczą po nim te domyślne przypisania.

   Linux opiera się na plikach, zatem strumień wejściowy danych uzyskujemy z otwartego określonego pliku na wejściu procesu. Strumień wyjściowy przez pisanie do określonego pliku otwartego na wyjściu procesu i wreszcie trzeci plik musimy otworzyć w celu wpisywania tam komunikatów o błędach.

   Każdy uruchomiony w systemie proces może otworzyć jednocześnie na swoje potrzeby do dwudziestu plików. Otwarty plik proces identyfikuje poprzez przyporządkowaną mu liczbę całkowitą zwaną deskryptorem pliku.

   Trzy liczby (0, 1, 2) są zarezerwowane i odpowiadają trzem plikom, które są zawsze otwierane w momencie utworzenia procesu:

deskryptor 0     -     stdin (standard input)       -     wejście standardowe
deskryptor 1     -     stdout (standard output)   -     wyjście standardowe
deskryptor 2     -     stderr (standard error)      -     standardowe wyjście błędów (diagnostyczne)

Dla wszystkich poleceń (programów) uruchamianych w ramach powłoki domyśle przypisania tych plików są następujące:

stdin     -     strumień znaków z klawiatury terminala
stdout   -     strumień znaków wysyłany na ekran terminala (monitora)
stderr    -     także strumień znaków wysyłany na ekran terminala (monitora)

   Polecenie nie musi korzystać z wejścia standardowego, na przykład ls nigdy nie pobiera danych z klawiatury (lecz zawsze z jakiegoś katalogu).

   Natomiast polecenie cat wydane bez żadnego argumentu (i opcji) będzie pobierało dane z klawiatury (standardowe wejście) i natychmiast wypisywało je na ekran (standardowe wyjście). Aby zakończyć tą sytuację musimy nacisnąć [CTRL]+[c] czyli przerwać cat lub nacisnąć [CTRL]+[d] co spowoduje zakończenie działania cat. [CTRL]+[d] wprowadza znak końca pliku (tzw. EOF - nie widoczny na ekranie).

   Jeśli polecenie "nie wie", z jakiego wejścia/wyjścia ma korzystać, jest wysoce prawdopodobne, że będzie korzystało ze standardowego. Zachowanie cat jest tego dobrym przykładem.

Łatwo wyobrazić sobie konstrukcję złożoną z wielu poleceń, w której strumień wyjściowy pierwszego polecenia jest dołączony do strumienia wejściowego drugiego polecenia, z kolei strumień wyjściowy drugiego polecenia dołączony jest do strumienia wejściowego trzeciego polecenia itd. Konstrukcję taką nazywamy potokiem (ang. pipe).
Często oprócz rezultatu końcowego potoku, interesują nas rezultaty (dane) pośrednie, które chcielibyśmy zachować w pliku do późniejszego wykorzystania. Wymaga to w wybranym przez nas miejscu potoku rozdzielenia strumienia danych. Służy do tego polecenie tee.

Manipulacja wejściem i wyjściem standardowym

Przełączając wyjście standardowe polecenia cat do pliku, możemy łatwo utworzyć krótki plik tekstowy o zadanej nazwie:

$ ls -F

kat1/   kat2/

[crash1@linux crash1]$ cat > zapis

to jest zapis tekstowy [Enter]

[CTRL]+[d]

[crash1@linux crash1]$ ls -F

kat1/   kat2/  zapis

[crash1@linux crash1]$ cat zapis

to jest zapis tekstowy

[crash1@linux crash1]$ _

Operator ">" oznacza przełączenie wyjścia standardowego do wskazanego pliku. W bieżącym katalogu zostaje utworzony plik zapis, a polecenie cat czeka na dane wprowadzone z klawiatury. Po wprowadzeniu tekstu, naciskamy [Enter], co powoduje jedynie przejście do nowej linii w nowo tworzonym pliku. Aby zakończyć akcję (zamknąć plik zapis), musimy wcisnąć kombinację klawiszy [CTRL]+[d], która powoduje wprowadzenie znaku końca pliku (EOF).

$ cat zapis > nowy

[crash1@linux crash1]$ ls -F

kat1/   kat2/  zapis   nowy

[crash1@linux crash1]$ cat nowy

to jest zapis tekstowy

[crash1@linux crash1]$ rm zapis nowy

[crash1@linux crash1]$ _

W tym przypadku polecenie cat zapis > nowy jest równoważne ze skopiowaniem pliku zapis do pliku pod nazwą nowy.
Ujawnijmy teraz podstawowe operatory służące do przełączania standardowych wyjść i wejść:

> plik   -  wyjście standardowe jest kierowane do pliku plik.

>> plik  -  analogicznie jak dla ">", z tym, że jeśli plik już istniał to jego

             dotychczasowa zawartość zostanie zachowana, gdyż dane strumienia

             standardowego zostaną dopisane.

< plik   -  jako wejście (zamiast klawiatury) zostanie otwarty plik plik.

2> plik  -  standardowe wyjście błędów jest kierowane do pliku plik.

2>> plik -  analogicznie jak dla "2>", z tym, że dane zostaną dopisane do pliku plik.

2>&1     -  przekierowuje standardowe wyjście błędów w to samo miejsce, gdzie jest

             skierowane wyjście standardowe.

1>&2     -  będzie oznaczało przekierowanie wyjścia standardowego w to samo miejsce,

             gdzie jest skierowane standardowe wyjście błędów.

Wykonajmy jeszcze przykład:

$ ls -F 2> diag  1>&2

[crash1@linux crash1]$ cat diag

diag

kat1/

kat2/

[crash1@linux crash1]$ rm diag

[crash1@linux crash1]$ _

Tutaj standardowe wyjście błędów polecenia ...

Zgłoś jeśli naruszono regulamin