Standardowe strumienie, przekierowania i potoki
Każde polecenie w systemie UNIX ma dostęp dotrzech funkcji systemowych:
standardowe wejście (standard input - stdin),
standardowe wyjście (standard output - stdout),
standardowe wyjście diagnostyczne - błędów (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 operatora: 2>.
Standardowe wejście przeadresowujemy operatorem <.
Przykłady:
ls > lista
- Zapisanie w pliku lista nazw plików i katalogów z katalogu bieżącego
cat plik1 > plik2
- Zapisanie zawartości pliku plik1 do pliku plik2
man ls > pomoc
- Umieszczenie treści pomocy do polecenia ls w pliku pomoc
wc < lista
- Wyznaczenie liczby wierszy, słów i znaków w pliku lista
cal 2005 > Rok2005
- Zapisanie kalendarza na rok 2005 do pliku Rok2005
Powłoka (shell) ustawia przeadresowanie przed uruchomieniem polecenia, po czym usuwa znaki przeadresowania z polecenia tak,
że samo polecenie ich nie widzi. Stąd, w konsekwencji, poniższe trzy polecenia są sobie równoważne:
cal 2000 > Rok2000
cal > Rok2000 2000
> Rok2000 cal 2000
Ponieważ operator > jest skrótem od 1> stąd następujące polecenia są równoważne:
cal 2000 > Rok2000
cal 2000 1> Rok2000
Przy stosowaniu operatora > pierwotna zawartość plików docelowych zostaje skasowana.
Jeżeli nie chcemy utracić pierwotnej zawartości pliku docelowego, używamy operatora dopisywania: >>
Przykłady:
man cd > plik
man ls >> plik
whoami >> plik
wc < plik > wynik
Powyższe polecenia spowodują utworzenie pliku plik, w którym zapisana będzie treść pomocy do poleceń:
cd oraz ls oraz nazwa użutkownika. Następnie polecenie wc wyznaczy liczbę linii, wyrazów i znaków,
i wpisze je do pliku wynik.
Komunikaty o błędach można wyprowadzać niezależnie od standardowego wyjścia używając operatora 2>
Przykłady:
polecenie 2> bledy
polecenie > log 2> bledy
polecenie 2> bledy > log
polecenie > log
W pierwszym przykładzie wyjście standardowe nie zostało przeadresowane i zostanie wyprowadzone na ekran,
podczas gdy ewentualne komunikaty o błędach zostaną zapisane w pliku bledy i nie pojawią się na ekranie.
W drugim przypadku standardowe wyjście zostanie przeadresowane do pliku log a wyjście diagnostyczne (błędów)
zostanie przeadresowane do pliku bledy. polecenie trzecie jest równoważne drugiemu.
W przypadku czwartym, wyjście diagnostyczne nie zostało przeadresowane i ewentualne komunikaty obłędach pojawią się na ekranie.
Aby zapisać standardowe wyjście oraz wyjście diagnostyczne do jednego pliku należy użyć konstrukcji: 2>&1 np.:
polecenie > wynik 2>&1
Operator 2>&1 musi być wpisany po przeadresowaniu wyjścia standardowego. Operator ten oznacza przeadresowanie
wyjścia diagnostycznego tam, gdze jest skierowane wyjście standardowe.
W systemie UNIX zastosowano system potoków umożliwiających skierowanie wyników działania jednego programu lub polecenia
na wejście innego. Służy do tego symbol | (ang. pipe):
Przykład:
ls /home/artemis/stud | more
Ćwiczenia:
- Utworzyć plik skrypt o treści:
#!/bin/zsh
echo Witamy !!!
maniana
- Nadać mu prawa do wykonania np poleceniem:
chmod u+x skrypt
.
Plik ten jest tzw. skryptem powłoki.
- Sprawdzić poleceniem
file skrypt
jekiego typu jest tem plik.
- Uruchomić skrypt wpisując polecenie:
./skrypt
Wynikiem działania skryptu jest wypisanie na stdin tekstu: Witamy !!!
a na stderr komunikatu o błędzie zwiazanego z nie zdefiniowaną instrukcją maniana.
- Korzystając z powyższego skryptu przećwiczyć użycie opisanych powyżej operatorów przeadresowania.
- Stosując odpowiednie polecenia i przekierowania wygenerować listę wszystkich
podkatalogów i plików (oprócz ukrytych) zawartych we własnym katalogu i zapisać ją w pliku lista.
- Stosując odpowiednie polecenia i przekierowania utworzyć plik zawierający
10 pierwszych i 5 ostatnich wierszy z pliku lista.
- Przetestować mechanizm potoków dla różnych poleceń.