Potoki i przekierowania

Potoki i przekierowania to jedne z najczęściej używanych właściwości powłoki. Pozwalają one zmieniać standardowe wejście, wyjście oraz standardowe wyjście błędów lub je łączyć w potoki.

Możemy przekierowywać dowolne z deskryptorów, jednak w większości przypadków wykorzystuje się je jedynie na standardowych wejściach i wyjściach. Powłoka interpretuje polecenie od lewej do prawej, tak więc wszystkie potoki i przekierowania są brane pod uwagę właśnie w takiej kolejności

Potoki

Składnia

polecenie1 [ | polecenie2] [ | polecenie3] ...

Jak więc widać potok jest ciągiem poleceń porozdzielanych znakiem „|”, przy czym standardowe wyjście polecenie poprzedzającego jest standardowym wejściem polecenia następnego.

Przykład

ls -al | grep ^d | wc -l

Powyższe wywołanie policzy nam ilość katalogów w katalogu w którym obecnie się znajdujemy.

Jak to działa?

  1. polecenie ls -al wyświetli nam zawartość całego katalogu (katalogi i pliki) wyjście tego polecenia jest przekierowane do
  2. drugiego polecenia grep służącego do wybrania tylko katalogów (reprezentowanych w listingu ls -al przez linie rozpoczynające się od litery d)
  3. trzecie polecenie wc pozwala nam policzyć ilość linii (przełącznik -l), które w poprzednim poleceniu odfiltrowaliśmy

Przekierowania

Przed wykonaniem polecenia powłoka sprawdza, czy nie powiązać określonych deskryptorów z innymi, bądź z plikami.

Przekierowanie wejścia

Składnia

[n]< plik

Powoduje otwarcie pliku do czytania i powiązanie deskryptora o numerze n z zawartością pliku. Jeśli pominiemy numer deskryptora powłoka przekieruje standardowe wejście (deskryptor nr 0).

Przykład:

mail jakis@adres.com < wiadomosc.txt

Można uzyć tzw. here documents.

Przekierowanie wyjścia

Składnia

[n] > plik

Powoduje otwarcie pliku do pisania i powiązanie go z deskryptorem o numerze n. Jeśli plik nie istnieje zostanie stworzony, jeśli istnieje zostanie nadpisany (zobacz opcję noclobber). Gdy pominiemy numer deskryptora powłoka przekieruje standardowe wyjście (deskryptor nr 1).

Przekierowanie wyjścia z dopisywaniem

Składnia

[n] >> plik

Powoduje otwarcie pliku do dopisywania (jeśli nie istnieje zostanie stworzony) i powiązanie go z deskryptorem o numerze n. Gdy pominiemy numer deskryptora powłoka przekieruje standardowe wejście.

Przekierowanie wyjśćia i wejścia

Składnia

[n] <> plik

Powyższe polecenie powoduje otwarcie pliku do czytania i pisania tak więc, mozemy z niego odczytywać dane i jednocześnie do niego zapisywać.

Przekierowanie wyjścia błędów i standardowego wyjścia

Składnia

proces >& plik

Powoduje otwarcie pliku do pisania i powiązanie go ze standardowym wyjściem i standardowym wyjściem błędów.

Powyższe definicje dosyć enigmatycznie tłumaczą zagadnienie przekierowania wyjść i wejść, ponieważ nie zbyt często są one używane - większość programów pobiera z linii komend wszystkie potrzebne argumenty.

Przykład:

find ~ -size +100M -xdev >& duze_pliki

Wpisując powyższą linię w powłoce w pliku duze_pliki otrzymamy listę plików zajmujących ponad 100 MB znajdujących się w naszym katalogu domowym. W pliku też zostaną umieszczone informacje o błędach.

Duplikowanie deskryptorów (komplikowanie prostych rzeczy ;))

Składnia

[n] &< [m]
[n] >& [m]

Powoduje, że czytając z deskryptora [n] dostajemy strumień z [m]. Podobnie wywołując [n] >& [m] pisząc do deskryptora [n] piszemy do deskryptora [m].

Przykład:

find ~ -size +100M -xdev > duze_pliki 2>&1

Wywołanie to jest równoważne wcześniejszemu. Standardowe wyjście jest powiązane z plikiem duze_pliki, a standardowe wyjście błędów ze standardowym wyjściem.

Dodatkowe informacje