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 standardowedeskryptor 1 - stdout (standard output) - wyjście standardowedeskryptor 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 terminalastdout - 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.
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
kat1/ kat2/ zapis nowy
[crash1@linux crash1]$ cat nowy
[crash1@linux crash1]$ rm zapis nowy
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
Tutaj standardowe wyjście błędów polecenia ...
dagonet32