Standardowe strumienie, przekierowania i potoki

 

Każde polecenie w systemie UNIX ma dostęp do trzech funkcji systemowych: standardowe wejście (standard input - stdin), standardowe wyjście (standard output - stdout), standardowe wyjście diagnostyczne (standard error output - stderr).

 

Stosowanie standardowych strumieni jest wygodne, gdyż można je łatwo przypisać plikom lub potokom. Operatorem przekierowania (przeadresowania) standardowego wyjścia jest znak > . Standardowe wyjście diagnostyczne przekierowujemy używając 2> . Standardowe wejście przeadresowujemy znakiem < . Proszę prześledzić poniższe polecenia:

 

ls > lista

cat plik1 > plik2

man ls > pomoc

wc < lista

cal 2003 > tenrok

 

Pierwsze polecenie spowoduje zapisanie w pliku lista nazw plików i katalogów z katalogu bieżącego. Polecenie drugie spowoduje zapisanie zawartości pliku plik1 do pliku plik2. Trzecie polecenie spowoduje umieszczenie wyniku polecenia man ls w pliku pomoc, tzn. umieszczenie pomocy do polecenia ls w pliku pomoc. Czwarte polecenie da nam w wyniku liczbę wierszy, słów i znaków w pliku lista. W ostatnim przykładzie kalendarz wygenerowany poleceniem cal zostanie zapisany w pliku o nazwie tenrok.

Shell (powłoka) ustawia przeadresowanie przed uruchomieniem polecenia, po czym usuwa znaki przeadresowania z polecenia tak, że samo polecenie ich nie widzi. Trzy poniższe polecenia są równoważne:

 

cal 2002 >  tenrok

cal > tenrok 2002

> tenrok cal 2002

 

> jest skrótem od 1> ,  stąd następujące dwa polecenia są równoważne:

 

cal 2002 > tenrok

cal 2002 1> tenrok

 

Przy stosowaniu operatora > pierwotna zawartość plików docelowych ( np. lista, plik2, pomoc) zostanie skasowana. Jeżeli nie chcemy utracić pierwotnej zawartości pliku docelowego używamy operatora dopisywania >> . Np. polecenie man cd >> pomoc spowoduje dopisanie do pliku pomoc objaśnienia polecenia cd. Proszę prześledzić poniższy przykład:

 

ls > lista                                                         prześlij wynik polecenia ls do pliku lista

whoami >> lista                                             dopisz dane o użytkowniku do pliku lista

wc < lista > wc_lista                                     zlicz wiersze, słowa i znaki w pliku lista i umieść wynik w pliku wc_lista

 

Komunikaty o błędach można zapisywać niezależnie od standardowego wyjścia używając operatora 2>

 

polecenie 2> polecenie.bledy

polecenie > log 2> bledy

polecenie 2> bledy >log

polecenie > log

 

W przypadku pierwszym standardowe wyjście nie zostało przeadresowane i zostanie wyprowadzone na ekran, podczas gdy ewentualne komunikaty o błędach zostaną zapisane w pliku polecenie.bledy i nie pojawią się na ekranie. W przypadku drugim standardowe wyjście zostanie przeadresowane do pliku log, a standardowe wyjście diagnostyczne do pliku bledy. Polecenie trzecie jest równoważne poleceniu drugiemu. W przypadku czwartym standardowe wyjście diagnostyczne nie zostało przeadresowane i ewentualne komunikaty o błędach zostaną wyświetlone na ekranie.

 

Aby zapisać standardowe wyjście i standardowe wyjście diagnostyczne w tym samym pliku należy użyć operatora przekierowania 2>&1 np.

polecenie > polecenie.wynik 2>&1

 

2>&1 musi być wpisane po przeadresowaniu w wierszu poleceń standardowego wyjścia. 2>&1 oznacza przeadresowanie standardowego wyjścia diagnostycznego tam, gdzie standardowe wyjście.

 

W systemie UNIX zastosowano system potoków umożliwiający skierowanie wyniku działania jednego programu lub polecenia na wejście innego. Służy do tego symbol | (ang. pipe):

 

polecenie1 | polecenie2

program1 | program2

 

Przykład

Sformatowanie wydruku zawartości katalogu zawierającego katalogi domowe studentów (/home/artemis/stud) za pomocą polecenia more

 

ls /home/artemis/stud | more

 

Ćwiczenie

·        Utwórz plik tekstowy o nazwie plik1 i następującej treści:

#!/bin/zsh
echo ”serdecznie witamy gospodarza domu”
kiszka

·       Nadaj mu prawa wykonywania poleceniem chmod a+x plik1. Teraz plik plik1 jest tak zwanym skryptem napisanym w języku powłoki. Wykonaj polecenie file plik1 aby dowiedzieć się jakiego typu jest plik plik1. Plik plik1 uruchamiamy wpisując w wierszu poleceń ./plik1. Wynikiem działania pliku plik1 jest wypisanie na standardowym wyjściu tekstu serdecznie witamy gospodarza domu oraz wysłanie na standardowe wyjście diagnostyczne komunikatu o błędzie związanego z nie zdefiniowaną instrukcją kiszka.

Korzystając z polecenia./plik1 przećwicz użycie opisanych w instrukcji operatorów przeadresowania.

·        Stosując odpowiednie polecenia i przekierowania wygeneruj listę wszystkich podkatalogów i plików (oprócz ukrytych) zawartych w Twoim katalogu własnym (w innej wersji: w katalogu nadrzędnym do twojego katalogu własnego) i zapisz ją w pliku lista_plikow w twoim katalogu własnym.

·        Stosując odpowiednie polecenia i przekierowania utwórz plik lista_plików_10 zawierający 10 pierwszych i 5 ostatnich wierszy pliku lista_plików.

·        Przetestuj mechanizm potoków dla różnych poleceń.

 

Strona poprzednia       Strona następna