Komputer & Internet

w domu i zagrodzie

[DOS] Strumienie, potoki i inne dojścia

Otoczenie każdego procesu posiada trzy strumienie, utożsamiane z pewnymi urządzeniami lub plikami. Wprowadzono je po raz pierwszy w systemie Unix.

  1. Strumień wejściowy (STDIN) – służy do czytania parametrów i danych.
  2. Strumień wynikowy (wyjściowy) (STDOUT) – przeznaczony jest do wypisywania wyników działania polecenia.
  3. Strumień diagnostyczny (STDERR)- tu kierowane są informacje o błędach.

Zwykle wszystkie trzy strumienie „połączone” są z konsolą (urządzenie con), ale można to zmienić. Można je przełączyć do innego urządzenia lub pliku, a zrobimy to używając następujących znaków: < , > i >> – są to tzw. operatory przekierowania poleceń.

polecenie < plik
polecenie > plik
polecenie >> plik

W pierwszej linii przełączamy strumień wejściowy, w drugiej i trzeciej strumień wyjściowy. Przekierowanie strumienia wyjściowego do pliku, który jeszcze nie istnieje stworzy go. Jeśli jednak plik już istnieje, to polecenie z drugiej linii nadpisze (zamrze) jego zawartość, a z trzeciej dopisze na jego końcu.

Strumienie, potoki i filtry w praktyce

Stwórzmy plik tekstowy zawierający listę imion:

Roman
Adam
Zdzisław
Andrzej
Bogdan
Stanisław
Czesław
Wojciech

i zapiszmy go np jako: c:\imiona.txt

Wypisujemy zawartość pliku na ekran – konsolę.

type c:\imiona.txt

A tu wypisujemy zawartość naszego pliku do nowego pliku

type c:\imiona.txt > c:\imiona_nowy.txt

Sprawdźmy co zawiera nowy plik

type c:\imiona_nowy.txt

Dodajmy jeszcze dwa imiona do naszej nowej listy

echo Marek >> c:\imiona_nowy.txt
echo Darek >> c:\imiona_nowy.txt 

Nasza lista powinna wyglądać teraz w ten sposób:

Roman
Adam
Zdzisław
Andrzej
Bogdan
Stanisław
Czesław
Wojciech
Marek
Darek

A teraz posortujmy zawartość pliku imiona_nowe.txt wg. alfabetu ustawiając przekierowanie strumienia wejściowego na nasz plik i wyślijmy posortowaną zawartość do pliku imiona_sort.txt ustawiając nań strumień wyjściowy:

sort < c:\imiona_nowy.txt > c:\imiona_sort.txt

To samo, ale z użyciem potoku.

type c:\imiona_nowy.txt | sort > c:\imiona_sort.txt

W dwóch ostatnich przykładach użyliśmy potoku (| – pionowa kreska) i filtru sort.
Potok „łączy” wyjście jednego procesu z wejściem innego, a filtr „przepuszcza” dane wykonując na nich określone przez nas operacje – w tym przypadku sortowanie.

Filtry MS DOS

MS DOS oferuje trzy filtry:

  • find – poszukuje określonych znaków w podanych plikach lub danych wyjściowych poleceń.
  • more – jeśli zawartość pliku lub danych wyjściowych polecenia składa się z większej ilości wierszy niż może wyświetlić okno wiersza poleceń, dzieli w/w dane na części mieszczące się na danym ekranie.
  • sort – sortuje pliki lub dane wyjściowe polecenia w kolejności alfabetycznej.

Przykłady użycia

type c:\imiona_nowy.txt | find "e" | sort > c:\imiona_z_e.txt

Type z użyciem potoku przekazuje zawartość pliku imiona_nowy.txt do filtru find, który wybiera tylko wiersze zawierające literę e, następnie potokiem przekazuje je do sort, który strumieniem umieszcza wynik w pliku imiona_z_e.txt.

Andrzej
Czesław
Darek 
Marek
Wojciech

Urządzenia w MS DOS

Standardowo MS DOS identyfikuje następujące nazwy jako urządzenia:

  • aux – synonim nazwy com1.
  • con – konsola użytkownika (klawiatura i ekran).
  • comn – urządzenie podłączone do portu szeregowego COM o nr n.
  • lptn – urządzenie podłączone do portu równoległego LPT o nr n.
  • nul – urządzenie puste, tzw. czarna dziura dla operacji pisania. Natychmiastowy sygnał końca pliku dla operacji czytania.
  • prn – synonim nazwy lpt1

Co daje nam wiedza o w/w urządzeniach? I jaki związek mają one ze strumieniami? A no taki:

type c:\imiona_nowy.txt > lpt1

Przekierowanie strumienia wyjściowego do lpt1 wysyła dane do drukarki podłączonej do portu LPT1. Czyli drukuje zawartość pliku.

type con > c:\tekst_z_con.txt
To zostanie zapisane w pliku[Enter]
Ta linia tez[Enter]
^Z[Enter]

Przekierowanie strumienia z con do pliku pozwala zapisać w nim tekst, nawet składający się z kilku wierszy – zmiana wiersza następuje po wciśnięciu klawisza Enter. Wprowadzanie danych do pliku kończymy wysyłając ^Z (Ctr + Z).

type c:\imiona_nowy.txt > nul

Przekierowanie strumienia wyjściowego do nul wysyła dane do „czarnej dziury”, czyli nigdzie.

Operatory przekierowania poleceń

Skoro wiemy już do czego i jak używać „ptaszków”, które fachowo zwane są operatorami przekierowania poleceń, czas aby poznać jeszcze dwa – rzadziej używane. Poniższa tabela zawiera wszystkie operatory z krótkim opisem.

Lista operatorów przekierowań poleceń
Operator Opis
> Zapisuje dane wyjściowe polecenia w pliku lub urządzeniu.
Jeśli plik nie istnieje tworzy go.
Jeśli plik istnieje zamazuje jego dotychczasową zawartość.
>> Dołącza dane wyjściowe polecenia na końcu pliku nie usuwając danych znajdujących się w tym pliku.
< Odczytuje dane wejściowe polecenia z pliku lub urządzenia.
| Potok, odczytuje dane wyjściowe polecenia i zapisuje je w danych wejściowych innego polecenia.
>& Zapisuje dane wyjściowe określonego dojścia w danych wejściowych innego dojścia.
<& Odczytuje jako dane wejściowe określonego dojścia dane wyjściowe dojścia, które także można określić.

Dwa ostatnie operatory pozwalają zmieniać strumieniom konkretne dojścia, oraz duplikować je. Tabela niżej przedstawia listę dojść z ich nr i krótkim opisem.

Lista dojść
Dojście Numeryczny
odpowiednik
dojścia
Opis
STDIN 0 Dane wejściowe wysyłane z klawiatury.
STDOUT 1 Dane wyjściowe wysyłane do okna wiersza polecenia.
STDERR 2 Komunikaty o błędach wyświetlane w oknie wiersza polecenia.
UNDEFINED 3-9 Te dojścia są definiowane indywidualnie przez aplikację i są specyficzne dla poszczególnych narzędzi.

Przykłady

1<&2

Polecenie przekierowuje dojście 2 (STDERR) do dojścia 1 (STDOUT).

polecenie > c:\plik.txt 2>&1

A to polecenie duplikuje dojście wysyłając dane zwracane przez polecenie i ewentualne komunikaty o błędach do pliku.txt.

Podsumowanie

Każde polecenie, program, który wynik swojego działania zwraca w konsoli wiersza poleceń korzysta ze strumieni. Możliwość przekierowania strumieni pozwala na dalsze przetwarzanie tych wyników, zapis w pliku, czy wydrukowanie na drukarce.

dir c: > c:\lista_plikow_i_katalogow.txt

Zapisuje wynik polecenia dir c:\ w określonym pliku.

MS DOS a Linux

Jak napisałem wyżej, strumienie, potoki i filtry wprowadzono po raz pierwszy w Unix’ie. A, że ułatwiają życie, więc Microsoft również je wprowadził. Ale jak to bywa z produktami MS, działają one trochę inaczej niż w Linux’ach.
Z racji tego, że Linux pozwala wykonać jednocześnie kilka procesów, to użycie potoku polega na równoczesnym uruchomieniu wszystkich jego procesów składowych, a do ich połączenia tworzone są niewielkie bufory. Kolejne procesy są uaktywniane w miarę wypełniania ich buforów wejściowych i opróżniania buforów wyjściowych. W odróżnieniu od systemu MS DOS, gdzie każdy proces musi zakończyć swoją pracę przed uruchomieniem kolejnego, co w przypadku większej ilości przetwarzanych danych może wymagać zapisania ich na dysku.
Poza tym Linux oferuje jeszcze klika ciekawych filtrów, ale o tym przy innej okazji.

Tags:

About

View all posts by

POST A COMMENT


Aby udowodnić, że jesteś człowiekiem, a nie spambotem proszę wykonać test poniżej.


*