Strumienie, potoki i przekierowania

1. Potoki

Siłą konsoli systemów uniksowych jest możliwość łączenia małych zwięzłych poleceń w większe, bardziej skomplikowane polecenia, za pomocą potoków (ang. pipe). Dane na wyjściu jednego programu będą stanowić dane wejściowe drugiego programu. To właśnie dlatego w systemach uniksowych tak powszechnie wykorzystywane są tekstowe strumienie danych. Te założenia legły u podstaw filozofii Uniksa.
Polecenia łączy się za pomocą operatora | zwanego czasem w polskojęzycznej literaturze „rurą” (ang. pipe). W skrócie wygląda to następująco:

polecenie1 | polecenie2 | polecenie3

W przykładzie poniżej wyjście polecenia ls przekierowuję do polecenia wc z parametrem -l, dzięki czemu zostanie wyświetlona liczba plików i katalogów w danym katalogu.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
nowy.txt  przykład.txt  wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls | wc -l
3

Potoki wykorzystywane są intensywnie w przypadkach takich jak przeszukiwanie logów systemowych z wykorzystaniem wyrażeń regularnych lub w wyszukiwaniu plików (o tym w dalszej części poradnika).

2. Strumienie i przekierowania

Tak jak wspominałem już na początku poradnika, powłoki w systemach uniksowych intensywnie wykorzystują strumienie: wejścia, wyjścia i błędów. Strumienie można przekierowywać z urządzenia, które standardowo je obsługuje na inne lub też do pliku, np. można przekierować komunikaty o błędach z monitora do pliku.
Każdy ze strumieni ma swój unikalny deskryptor oznaczany liczbowo:

  • stdout — standardowe wyjście (deskryptor 1) — przeważnie jest to monitor komputera,
  • stderr — standardowe wyjście błędów (deskryptor 2) — przeważnie jest to monitor komputera,
  • stdin — standardowe wejście (deskryptor 0) — przeważnie jest to klawiatura komputera.

Do przekierowania używa się operatora deskryptor>, gdzie za deskryptor podstawia się jedną z wartości liczbowych przedstawionych powyżej. Jeżeli plik, do którego przekierowujemy, nie istnieje, to zostanie utworzony (oczywiście o ile mamy uprawnienia do zapisu w danym katalogu). Jeżeli plik istnieje (i mamy uprawnienia do zapisu w nim), jego zawartość zostanie zastąpiona. Aby tego uniknąć, należy użyć operatora deskryptor», który dopisze zawartość strumienia na koniec pliku.

W poniższym przykładzie przekieruję standardowy strumień błędów do pliku error.txt, następnie przekieruję standardowe wejście z klawiatury do pliku i na koniec przekieruję na standardowe wyjście polecenie z pliku polecenie.txt

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ cat \\
nieistniejacy_plik.txt 2> error.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ cat error.txt
cat: nieistniejacy_plik.txt: No such file or directory
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ cat > polecenie.txt
ls -l
(Ctrl+D)
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ bash < polecenie.txt
razem 8
-rw-r--r-- 1 adam adam 55 2007-06-26 14:04 error.txt
-rw-r--r-- 1 adam adam  0 2007-06-10 12:00 nowy.txt
-rw-r--r-- 1 adam adam  5 2007-06-26 14:07 polecenie.txt
-rw-r--r-- 1 adam adam  0 2007-06-04 00:00 przykład.txt
-rw-r--r-- 1 adam adam  0 2007-06-05 12:00 wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$

Przekierowania dość powszechnie wykorzystywane są w przypadku zadań uruchamianych w tle, kiedy nie ma potrzeby przeglądania komunikatów programu na bieżąco. Warto również wspomnieć o tym, jak całkowicie pozbyć się komunikatów.


adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ cat \\
nieistniejacy_plik.txt 2> /dev/null

Ponieważ wszystkie urządzania w Uniksie są reprezentowane jako pliki, istnieje możliwość takiego przekierowania jak powyżej, innymi słowy wszystkie komunikaty błędów trafiły do śmietnika czyli urządzenia /dev/null.

3. xargs

Poleceniem, którego działanie wiąże się z ideą strumieni i potoków, jest polecenie xargs. Otrzymuje ono na wejściu strumień tekstu i rozdziela go wg kryteriów (znak null lub znak końca wiersza) i następnie tak rozdzielone fragmenty przekazuje po kolei jako argumenty do kolejnego polecenia. xargs jest bardzo często wykorzystywany w połączeniu z poleceniami find, locate i grep.

adam@laptop:~$ ls | grep raport | xargs -i cp {} Dokumenty/

W powyższym przykładzie zastosowano polecenie grep, które szerzej zostanie omówione później. Wszystkie pliki, zawierające w nazwie ciąg znaków raport, zostaną przekopiowane do katalogu Dokumenty, dzięki zastosowaniu opcji -i, nawiasy {} zastępowane są fragmentem strumienia, w tym przypadku nazwą pliku. Kolejnym często używanym parametrem tego programu jest parametr -0 (lub równoważny null). Dzięki niemu jako znak rozgraniczający fragmenty strumienia będzie wykorzystywany znak null. Opcja ta przydatna jest w przypadku nazw plików zawierających spację. Uwaga! Opcja -0 (null) dostępna jest tylko w wersji GNU polecenia xargs.

Przejdź do następnego artykułu: Wyszukiwanie, wyrażenia regularne »

Komentarze na statycznych stronach zostały wyłączone. Zapraszamy do komentowania na forum.