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ń.