Pipe

Mechanizm łączący standardowe wyjście jednego procesu ze standardowym wejściem drugiego, zapisywany symbolem '|’. Pozwala budować łańcuchy poleceń przetwarzających dane.

Pipe (potok) to mechanizm systemu uniksowego, który łączy standardowe wyjście (stdout) jednego procesu ze standardowym wejściem (stdin) drugiego. Zapisujesz go pionową kreską |, a powłoka uruchamia oba polecenia jednocześnie i przepuszcza dane z lewej strony do prawej. Dzięki temu nie musisz tworzyć plików tymczasowych ani kopiować wyników ręcznie — strumień bajtów leci prosto z jednego programu do następnego.

Jak to działa i do czego służy

Pipe to w praktyce bufor w pamięci jądra. Proces po lewej pisze do niego, proces po prawej z niego czyta. Jeśli czytający nie nadąża, piszący na chwilę „zawiśnie” i poczeka — działa tu mechanizm backpressure, więc dane się nie gubią. Oba procesy biegną równolegle, a nie jeden po drugim, co bywa szybsze niż zapis do pliku i ponowne wczytanie.

Filozofia Uniksa brzmi: „rób jedną rzecz, ale rób ją dobrze”. Pipe jest tym, co spina te małe narzędzia w całość. Zamiast jednego monstrualnego programu masz łańcuch prostych klocków: jeden filtruje, drugi sortuje, trzeci liczy. Każdy z nich jest wymienny.

Przykład z praktyki

Chcesz sprawdzić, które adresy IP najczęściej pukają do twojego serwera. Klasyczny łańcuch wygląda tak:

cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head

Po kolei: awk wyciąga pierwszą kolumnę (IP), sort układa je obok siebie, uniq -c zlicza powtórzenia, drugi sort -nr sortuje malejąco po liczbie, a head pokazuje czołówkę. Pięć narzędzi, jedna linijka, zero plików pośrednich.

Częste błędy i mity

Pipe nie przepuszcza błędów. Symbol | łączy tylko stdout. Komunikaty z stderr nadal lecą na ekran. Jeśli chcesz je też przekierować, użyj 2>&1 albo skrótu |& w bashu.

To nie to samo co redirekcja. Pojedynczy | łączy dwa procesy, a > zapisuje wyjście do pliku. Mylenie ich to klasyka początkujących.

„Useless use of cat”. Zaczynanie łańcucha od cat plik | jest zbędne — większość narzędzi przyjmie plik bezpośrednio, np. awk '{print $1}' access.log. Działa, ale weterani się skrzywią.

Pamiętaj też, że status zakończenia całego łańcucha to domyślnie kod ostatniego polecenia. Gdy chcesz wyłapać błąd wcześniejszego ogniwa, włącz set -o pipefail.

Pojęcia powiązane

Warto poznać: stdin, stdout i stderr (strumienie standardowe), redirekcję (>, >>, <), named pipe czyli FIFO (mkfifo), polecenie tee (rozgałęzia strumień do pliku i dalej), xargs oraz filozofię Uniksa.