Content Protection by DMCA.com

Strumienie, potoki i inne dojścia

Contents

Strumienie w MS DOS

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

Lista strumieni
Strumień Typ Przeznaczenie
STDIN wejściowy Służy do czytania parametrów i danych
STDOUT wynikowy (wyjściowy) Przeznaczony jest do wypisywania wyników działania polecenia.
STDERR diagnostyczny 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ń.

Urządzenia w MS DOS

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

Lista urządzeń
Nazwa Przeznaczenie
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

Operatory przekierowania poleceń

Lista operatorów przekierowań
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. Jeśli plik nie istnieje tworzy go.
< 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ć.

Za chwilę przejdziemy do praktycznego użycia potoków i strumieni, wspomnieć należy jeszcze o ich dojściach.

Lista dojść

Lista dojść
Strumień 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. W praktyce nie spotkałem ich użycia.

Tyle teorii. Czas na praktykę.

Strumienie i potoki w praktyce

Niżej cztery przykłady najczęściej spotykanych konstrukcji poleceń z użyciem strumieni i potoków:

polecenie > urządzenie/plik
polecenie >> urządzenie/plik
polecenie < plik
polecenie1 | polecenie2 > urządzenie/plik

Opisy znaczenia poleceń w poszczególnych wierszach:

  1. Wyście – wynik polecenia zostanie wysłany do urządzenia lub pliku. Jeśli plik nie istnieje zostanie stworzony, a jeśli istnieje, jego zawartość zostanie nadpisana.
  2. Wyście – wynik polecenia zostanie wysłany do urządzenia lub pliku. Jeśli plik nie istnieje zostanie stworzony i wynik polecenia zostanie dopisany na końcu pliku.
  3. Do polecenia zostanie załadowana zawartość pliku.
  4. Wyście – wynik polecenia1 zostanie wysłany do polecenia2. Następnie wyjście – wynik polecenia2 zostanie wysłany do urządzenia lub pliku.

Skoro wiemy już do czego i jak używać „ptaszków”, przejdźmy do przykładów.

Przykłady

Dla ułatwienia pracy stwórzmy katalog na nasze ćwiczenia i przykłady.

mkdir c:\sprytneit

Podłączamy plik do klawiatury.

W konsoli wpisujemy poniższe wiersze. Symbol ^Z to Ctr + z.

type con > c:\sprytneit\koledzy.txt
Zbyszek[Enter]
Marian[Enter]
Jakub[Enter]
Darek[Enter]
Stasiek[Enter]
Tadzik[Enter]
^Z[Enter]

Co robi polecenie z wiersza 1. Otóż:
Polecenie type wyświetla zawartość [pliku tekstowego], natomiast ptaszek > wysyła zawartość do pliku c:\sprytneit\koledzy.txt.
My jednak zamieniliśmy [plik tekstowy] na urządzenie [con], a konkretnie na jego wejście, czyli klawiaturę.
Tak więc, tekst z klawiatury trafia do pliku c:\sprytneit\koledzy.txt.

Efekt naszej pracy obejrzymy wydając polecenie:

C:\>type c:\sprytneit\koledzy.txt

Zbyszek
Marian
Jakub
Darek
Stasiek
Tadzik

Jeszcze raz podłączamy plik do klawiatury.

Tworząc listę kolegów zapomnieliśmy o Zdzichu i Jarku. Dodajmy więc ich do istniejącego pliku koledzy.txt:

type con >> c:\sprytneit\koledzy.txt
Zdzichu[Enter]
Jarek[Enter]
^Z[Enter]

Proszę zwróć uwagę, że w tym przykładzie użyliśmy podwójnego ptaszka >>, który wprowadzane dane dopisał na końcu istniejącego już pliku.

Z dwóch plików robimy jeden

W dowolny sposób tworzymy listę koleżanek: c:\sprytneit\kolezanki.txt
Następnie wydajemy polecenia:

type c:\sprytneit\kolezanki.txt >> c:\sprytneit\znajomi.txt
type c:\sprytneit\koledzy.txt >> c:\sprytneit\znajomi.txt

W obu wierszach strumień wyjściowy polecenia type przekierowujemy do pliku c:\sprytneit\znajomi.txt. Używając operatora >> dopisujemy do niego zawartość pliku c:\sprytneit\kolezanki.txt i c:\sprytneit\koledzy.txt.
Polecenie z wiersza pierwszego przed dodaniem zawartość wypisanego pliku tworzy plik c:\sprytneit\znajomi.txt.

Efekt naszej pracy obejrzymy wydając polecenie:

C:\>type c:\sprytneit\znajomi.txt

Zyta
Ola
Ania
Maria
Halina
Justyna
Ada
Zbyszek
Marian
Jakub
Darek
Stasiek
Tadzik
Zdzichu
Jarek

Ptaszek w przeciwną stronę, i nie tylko.

more +4 < c:\sprytneit\znajomi.txt
more +4 < c:\sprytneit\znajomi.txt > c:\sprytneit\inietylko.txt

Wiersz pierwszy. Wysyłamy zawartość pliku c:\sprytneit\znajomi.txt do polecenia more które wyświetla na konsoli jego zawartość pomijające cztery pierwsze wiersze (parametr +4).
Wiersz drugi. Robimy to samo, tylko wynik polecenia zamiast wysłać na konsolę wysyłamy do c:\sprytneit\inietylko.txt.

Potok i strumień.

type c:\sprytneit\znajomi.txt | more +6
tar pliki | gzip > pliki.tar.gz

Wiersz pierwszy. Dane z type wysyłamy potokiem | do more
Wiersz drugi. Tar archiwum plików wysyła potokiem do gzip, który strumieniem wysyła swoją pracę do pliki.tar.gz. – Jak widać na przykładzie strumienie i potoki przetwarzają nie tylko pliki tekstowe.

Podłączamy ekran do czarnej dziury.

type c:\sprytneit\znajomi.txt > nul

To co type miało wysłać na konsolę wysłaliśmy w otchłań nicości – do nul.

Dojścia – czyli o strumieni rozdzielaniu

dir c:\sprytneit\abc\ 1>c:\sprytneit\stdout.txt 2>c:\sprytneit\stderr.txt

W tym przypadku zawartość STDOUT (1) wysyłamy do c:\sprytneit\stdout.txt, a STDERR (2) – błędy kierujemy do c:\sprytneit\stderr.txt.

STDERR do STDOUT

polecenie > plik.txt 1<&2

Ptaszkami 1<&2 przekierowujemy dojście 2 (STDERR) do dojścia 1 (STDOUT).

Duplikowanie dojścia

polecenie > plik.txt 2>&1

A te 2>&1 ptaszki duplikują dojście wysyłając dane zwracane przez polecenie i ewentualne komunikaty o błędach do pliku.txt.

Czy jest możliwe …?

Czy jest możliwe wysłanie efektu pracy tar’a do konsoli, a nie do pliku?
Oczywiście, że jest …

tar pliki >&1

… bez sensu.
Tar odmówi pisania zawartości archiwum do terminala. 🙂

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, wydrukowanie na drukarce, czy przekazanie innemu programowi jako dane wejściowe.