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
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.
ls -al
wyświetli nam zawartość całego katalogu (katalogi i pliki) wyjście tego polecenia jest przekierowane dogrep
służącego do wybrania tylko katalogów (reprezentowanych w listingu ls -al
przez linie rozpoczynające się od litery d
)wc
pozwala nam policzyć ilość linii (przełącznik -l
), które w poprzednim poleceniu odfiltrowaliśmyPrzed wykonaniem polecenia powłoka sprawdza, czy nie powiązać określonych deskryptorów z innymi, bądź z plikami.
[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.
[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).
[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.
[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ć.
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.
[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.