Potok jest ciągiem poleceń prostych lub złożonych, które są odseparowane od siebie przez znak |. Rezultat każdego polecenia – z wyjątkiem ostatniego – jest traktowane przez polecenie następne jako jego standardowe wejście. Innymi słowy - potok – jest mechanizmem komunikacji pomiędzy różnymi poleceniami, który im pozwala wymieniać między sobą dane. Prześledźmy funkcjonowanie mechanizmu potoków na konkretnych przykładach.
Wykonajmy następujące polecenie:
$ ls -l /home
drwxr-xr-x 2 piotr oracle 1024 May 15 2003 test
drwxr-xr-x 2 ola oracle 512 May 25 2003 katalog5
drwxr-xr-x 5 piotr oracle 1024 May 17 2003 test1
-rwxr-xr-x 1 piotr oracle 1536 May 18 2003 plikb
-drwxr-xr-x 2 piotr oracle 1325 May 15 2003 plikc
Rezultatem egzekucji polecenia - ls -l - jest lista zarówno plików jak i katalogów, otóż chcielibyśmy wiedzieć ile ich jest ? Zastosowanie mechanizmu potoków umożliwi nam ich policzenie. Wiemy, że powyższa lista jest wejściem standardowym następnego polecenia, które wykona stosowne obliczanie. Tym poleceniem – jak być może pamiętacie – jest: wc -l . Tak więc by policzyć pliki katalogu domowego musimy wykonać następujące polecenie „potok” :
$ ls - l | wc -l
5
Wyobraźmy sobie teraz, że chcemy wyświetlić na ekranie wszystkie pliki zawarte w katalogu /usr, podejrzewamy – dlaczego ? -, że może być ich dużo. Co zrobić by ich lista nie „przedefilowała”, bez zatrzymania na ekranie co uniemożliwiłoby nam spokojne jej odczytanie. Otóż w tym wypadku też możemy zastosować mechanizm potoku:
$ ls –l /usr | more #jak inaczej możemy obejrzeć w/w listę stronicę po stronicy ?
Jak zapewne zauważyliście na ekranie wyświetlany jest tylko rezultat końcowy „potoku”, dane pośrednie np. rezultat polecenia: ls –l z „potoku”: ls -l | wc -l , giną. Czy nie ma żadnego sposobu ich zapisania np. w jakimś oddzielnym pliku? Mechanizm zapisywania w plikach rezultatów poszczególnych poleceń wchodzących w skład „potoku” uzyskujemy przy pomocy polecenia: tee nazwa_pliku.
Jeśli chcemy zapisać rezultat polecenia: ls -l to nasz potok przybierze formę następującą:
$ ls -l | tee plikb | wc -l
Mechanizm zapisywania w plikach rezultatów poszczególnych poleceń wchodzących w skład „potoku” nazywamy rozgałęzieniem „potoku”.
Rezultat „potoku” może być uzyskany także przy pomocy odpowiednich skierowań:
Skierowanie do pliku Użycie „potoku”
$ polecenie1 > plik1
polecenie1 | polecenie2
$ polecenie2 < plik1
$ rm plik1
$ polecenie1 > plik_a
$ polecenie2 < plik_a > plik_b
polecenie1 | polecenie2 | polecenie3
$ polecenie3 < plik_b
Mechanizm funkcjonowania potoków wymaga od użytkownika zapamiętania nie tylko znaczeń poszczególnych poleceń, ale także pamiętania ich rezultatów. Podamy teraz kilka „potoków’’, których interpretacje rezultatów pozostawiamy czytelnikowi.
$ who | wc -l
$ cat /etc/passwd | wc -l
$ cat /etc/group | wc -l
$ cat /etc/passwd | grep /bin/bash | wc -l
$ ls -l | grep ‘’-wxr-xr-x’’ | more
Kurs Linux - Bash potoki