Site hosted by Angelfire.com: Build your free website today!

Strumienie, potoki ... i filtry

Rozróżniamy 3 strumienie danych: wejściowy (stdin - standard input), wyjściowy (stdout - standard output) i strumień błędów (stderr - standard error). Każdy proces w Linuxie (proces - program, skrypt, komenda), ma przyporządkowane właśnie te trzy strumienie danych. Przykładowo jeśli program się wysypie (zakończy z błędem) to wysyła odpowiedni komunikat na stderr (standard error - standardowe wyjście błędu), którym zazwyczaj jest ekran monitora. Aby lepiej zrozumieć strumienie danych, rozważmy i przeanalizujmy następujące polecenie:


grep "wyrażenie" plik

Polecenie grep służy do wyszukiwania odpowiedniego wyrażenia (zdefiniowanego przez użytkownika) w danym pliku. Polecenie grep najpierw pobiera odpowiednie dane (wyrazenie) z pliku (stdin) i przekazuje je do standardowego wyjścia (stdout), którym zazwyczaj jest ekran monitora. Błędy wędrują na standardowe wyjście błędu (stderr), czyli zazwyczaj też na ekran monitora. W skrócie można napisać w punktach co robi to polecenie (grep "wyrazenie" plik):


1) Polecenie grep wyszukuje na wejściu (stdin) odpowiedniego wyrażenia.
2) Następnie "zapisuje" wynik na wyjściu (stdout), którym zazwyczaj jest monitor.
3) Jeśli są jakieś błędy to wędrują one na wyjście błędów (stderr), czyli zazwyczaj 
   na ekran monitora.

Dlaczego mówie zazwyczaj ??? Bo można te dane wyjściowe, wejściowe, błędów dowolnie przekierowywać (np. do pliku). Dla przykładu aby przekierować wyniki polecenia grep "wyrazenie" plik do pliku musimy użyć znaku > np.:

grep "wyrazenie" plik > do_pliku - polecenie to spowoduje przekierowanie stdout (standardowego wyjścia tego polecenia - wyniku) do pliku o nazwie do_pliku.

UWAGA! Sam znaczek > powoduje nadpisanie pliku, tzn. jeśli go użyjemy z przekierowaniem na jakiś plik to dane w tym pliku, które były zapisane wcześniej są tracone. Aby dodać (dopisać) coś do pliku należy użyć znaku >> np.:

grep "wyrazenie" plik >> dopisz_do_pliku - spowoduje dopisanie do pliku o nazwie dopisz_do_pliku standardowego wyjścia (stdout) polecenia grep "wyrazenie" plik.

Poniżej inne znaki, które są pomocne w przekierowywaniu "czegoś" na "coś":


polecenie 2> plik - powoduje wysłanie stderr do pliku o nazwie plik. polecenie < plik - powoduje odczyt stdin z pliku o nazwie plik. polecenie 2>> plik - powoduje dopisanie stderr do pliku o nazwie plik. polecenie <<r plik - powoduje odczyt stdin z pliku, aż do znaku "r".

No i na koniec kilka przykładów:


* cat > plik - powoduje utworzenie pliku o nazwie plik. Następnie pokaże nam się pusty wiersz i możemy pisać co uważamy za stosowne (aby przejść do nowego wiersza należy wcisnąć enter). Jeśli uznamy, że już chcemy aby nasza praca (tekst) się zapisał wciśnijmy kombinacje klawiszy [Ctrl+D]. Spowoduje to, że wyjdziemy z edycji pliku. Aby przejrzeć plik (zobaczyć co tam nagryzmoliliśmy) użyjmy po prostu polecenia cat plik, gdzie plik to nazwa pliku który chcemy przejrzeć. * cat >> plik - to samo co wyżej z tym, że dopisujemy tekst do pliku. * echo "Jakies zdanie" > plik - powoduje zapisanie w pliku o nazwie plik zdania "Jakies zdanie". Aby natomiast dopisać zdanie do pliku użyjmy zamiast > znaku >>. * cat plik plik1 plik2 > bigplik - powoduje zapisanie w pliku bigplik danych z plików plik, plik1, plik2. * sort plik > plik1 - sortuje zawartość pliku plik i zapisuje wynik w pliku plik1.

Chyba wystarczy już tych przykładzików. A teraz powiem co nieco o potokach. A więc potok - | - (ang. pipe) umożliwia przesyłanie danych wyjściowych (stdout) jednego polecenia, na dane wejściowe (stdin) drugiego. Człowiek najlepiej uczy się na przykładach (no i na błędach :)) więc poniżej przykład zastosowania potoku:

ls | more - dane wyjściowe polecenia ls (listing plików) trafiają na wejście polecenia more. Polecenie more stosuje się przy odczytywaniu na ekranie monitora dużych plików znakowych. Zastosowanie go powoduje, że po wyświetleniu porcji tekstu zajmującej pełny ekran nastąpi zatrzymanie wyświetlania i wyświetlenie komunikatu -- More -- w dolnym wierszu ekranu. Naciśnięcie dowolnego klawisza spowoduje wyświetlenie następnej porcji tekstu. Poleceniem podobnym do polecenia more jest polecenie less, np.:

ls | less

Gdy już o tym mowa to powiem coś niecoś o filtrach (poleceniach filtrujących). A więc filtry są poleceniami modyfikującymi w określony sposób informację wejściową i przekazującymi ją na wyjście. Filtr pobiera zawsze dane ze standardowego wejścia (stdin) i przesyła wyniki na standardowe wyjście (stdout). Oznacza to, że filtry można "włączyć" do przetwarzania potokowego. Linux zawiera kilka poleceń filtrujących (m. in. wspomniany już more i less, ale także sort, grep, etc.). Przykładem połączenia potoku z filtrem jest, np. polecenie ls | grep "katalog". I to na tyle odnośnie strumieni, potoków i filtrów. Jak coś niejasne to nie krępować się tylko majl me! :))