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:
- 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.
- 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.
- Do polecenia zostanie załadowana zawartość pliku.
- 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.