Potoki: co musisz wiedzieć, aby zacząć ich używać w systemie GNU / Linux

rury

A rura lub pipe jest faktycznie potokiem dostępnym dla UNIX / Linux i bardzo praktycznym. Aby jednak w pełni zrozumieć, czym jest potok, należy wiedzieć, że w środowisku * nix ma on 3 wbudowane strumienie danych. Dla tych, którzy nie wiedzą, oznacza to, że dane mogą podróżować do lub z trzech punktów.

Wtedy lepiej to zrozumiesz, ale chcę wam teraz wyjaśnić, że za pomocą rurociągu można skierować z jednego z tych punktów do innych. Pozwala to na pobranie wyniku lub wyniku, który program rzuca na wejście innego, aby ten mógł go użyć itp. Postaram się to wyjaśnić kilkoma praktycznymi przykładami, które pomogą Ci bardzo dobrze to zrozumieć.

Te punkty, o których mówiłem lub strumienie danych, są:

  • stdin: odpowiada 0 i jest standardowym wejściem. Generalnie, standardowym wejściem dla systemu * nix jest klawiatura. Oznacza to, że to, co wpiszesz, będzie wykorzystane. Ma powiązane z nią specjalne urządzenie, którym jest / dev / stdin.
  • stdout: identyfikowane z 1, jest to standardowe wyjście. Zwykle odpowiada monitorowi lub ekranowi komputera, na którym można zobaczyć informacje. Na przykład, kiedy uruchomisz polecenie ls, lista treści zostanie wyświetlona na ekranie, prawda? Skojarzone urządzenie to / dev / stdout.
  • stderr: identyfikowane za pomocą 2, jest standardowym wyjściem błędu, gdy wystąpi błąd w programie. Skojarzone urządzenie to / dev / stderr.

Za pomocą potoku można sprawić, że standardowe wyjście lub standardowe wyjście jednego polecenia zostanie przekazane bezpośrednio na standardowe wejście innego. Oznacza to, że możesz sprawić, że jeden program będzie zasilał inny. Zamiast używać parametrów wprowadzanych z klawiatury, potok dostarcza informacje wygenerowane przez poprzednie polecenie za pośrednictwem tego potoku reprezentowanego przez |

z przykłady zrozumiesz lepiej. Załóżmy, że chcesz wyświetlić zawartość katalogu, ale chcesz zobaczyć tylko nazwy, które pasują do słowa doc. Możesz więc użyć potoku, aby przesłać wyjście ls do wejścia filtru grep, aby powiedzieć mu, aby wyświetlał tylko te, które pasują do tego wzorca:

ls -l | grep doc

Więc zamiast pokazywać wszystkie nazwy, po prostu pokazuje te, które naprawdę Cię interesują. Możesz zrobić to samo z zawartością pliku. Wyobraź sobie, że chcesz zobaczyć tylko informacje o procesach o nazwie firefox, a nie wszystkie:

ps aux | grep firefox

Zamiast pokazywać na ekranie wszystkie dane wyjściowe programu ps (stdout), kieruje je w kierunku wejścia filtru grep i pokazuje na wyjściu tylko to, co w tym przypadku odpowiada wzorcowi Firefoksa ...

Jeśli chcesz, możesz użyć różne rury przenosi wyjście jednego polecenia na wejście innego drugiego polecenia, wyjście drugiego polecenia na wejście trzeciego i tak dalej. Na przykład:

cat libro | grep love | more

Jak widać, możliwości jest wiele, wszystko, co możesz sobie wyobrazić i co możesz. Nawet pokaż tylko pierwszą i ostatnią linię pliku, policz wiersze wchodzące do wc, które pochodzą z listy, a nawet posortuj je:

cat listado | head
cat listado | tail
cat listado | wc -l
cat listado | sort

Możesz także pracować z błędy z | & i na przykład poszukaj słowa alert w danych wyjściowych skryptu, jeśli się nie powiedzie:

./miscript |& grep alerta 

I wreszcie są dwa polecenia ściśle powiązane z rurami tee i xargs i że mogą jeszcze bardziej rozszerzyć ich możliwości. W przypadku tee pozwoli to na pokazanie wyniku poprzedniego programu na standardowym wyjściu, abyś mógł go zobaczyć, a ponadto może przesłać go do innego pliku. Przykładem może być, jeśli wypiszesz zawartość katalogu i chcesz zobaczyć wyjście ls -l w tej chwili, a także zapisać je w pliku listing.txt:

ls -l | tee listado.txt

Jeśli nie używasz trójnika, nie będziesz w stanie zobaczyć danych wyjściowych na konsoli ...

Y xargs w niektórych przypadkach jest to nawet bardziej interesujące. W tym przypadku jest w stanie zbudować polecenie ze standardowego wejścia, które otrzymuje przez potok. Innymi słowy, jest w stanie przechwycić wszystko, co poprzedni program uruchomił przez swoje wyjście i co dociera do xargs przez potok, aby przekazać to z kolei do innego polecenia jako argumenty.

Nadal nie rozumiesz? Na przykładzie zobaczysz to znacznie lepiej. Wyobraź sobie, że chcesz usunąć wszystkie cholerne pliki thumbs.db z katalogu, dysku lub partycji. Jeśli jest ich wiele, może być niemożliwe przejście jeden po drugim za pomocą polecenia rm, aby usunąć je ręcznie. Ale dzięki xargs możesz zautomatyzować wszystko. Możesz to zrobić za pomocą find, aby je zlokalizować, wysłać dane wyjściowe przez wejście xargs, a to z kolei da rm nazwy jako argumenty. Dlatego wszystkie zlokalizowane zostaną automatycznie usunięte:

find ./ -name "thumbs.db" | xargs rm

Na przykład załóżmy, że find lokalizuje /home/name/thumbs.db, /media/test/thumbs.db i /tmp/thumbs.db. Cóż, xargs dostarczy je do rm, jakby były argumentami. To tak, jakbyśmy wykonali: rm /home/name/thumbs.db, następnie rm /media/test/thumbs.db, a następnie rm /tmp/thumbs.db.


Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: AB Internet Networks 2008 SL
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   Jose powiedział

    Świetnie, ta informacja jest bardzo ważna dla nas, użytkowników Linuksa

  2.   Daniel powiedział

    Co za dobry artykuł, teraz, kiedy studiuję przekierowanie I / O w książce Linux Command Line. Jest dla mnie jaśniejsze o rurach (Pipeline) i trzech strumieniach danych. Wkład jest doceniany. Pozdrowienia.

  3.   01101001b powiedział

    Przykład z xargs pasował mi jak ulał. Dokładnie dzisiaj miałem do czynienia z tym małym szczegółem wielokrotnego wyjścia, który musiałem wysłać „w częściach”. xargs spacerował po pinturicie.
    Bardzo wdzięczny!