Napisane przez mediologia dnia . Wysłane Rozdział 5 - Bash.

5.5 Potoki


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