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.
Świetnie, ta informacja jest bardzo ważna dla nas, użytkowników Linuksa
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.
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!