а тръба или тръбаe всъщност е конвейер, наличен за UNIX / Linux и много практичен. Но за да разберете напълно какво е тръба, трябва да знаете, че в среда * nix има 3 вградени потока от данни. Това за тези, които не знаят, означава, че данните могат да пътуват до или от три точки.
Тогава ще разберете това по-добре, но това, което искам да ви изясня сега, е, че с конвейер това, което можете да направите, е да насочвате от една от тези точки към други. Това позволява да се вземат изхода или резултата, които програмата изхвърля към входа на друг, за да може този да се използва и т.н. Ще се опитам да го обясня с някои практически примери, които ще ви помогнат да го разберете много добре.
Тези точки, за които говорих или потоци от данни, са:
- стандартния вход: съответства на 0 и е стандартният вход. Обикновено стандартният вход за система * nix е клавиатурата. Тоест това, което въвеждате, ще бъде използваната информация. Тя има специално устройство, свързано с него, което е / dev / stdin.
- стандартния изход: идентифициран с 1, това е стандартният изход. Обикновено той съответства на монитора или екрана на вашия компютър, където можете да видите информацията. Например, когато изпълните команда ls, списъкът със съдържание ще се покаже на екрана, нали? Свързаното устройство е / dev / stdout.
- STDERR: идентифициран с 2, това е стандартният изход за грешка, когато възникне грешка в програма. Свързаното устройство е / dev / stderr.
С тръба можете да накарате стандартния изход или stdout на една команда да премине директно към стандартния вход на друга. Тоест можете да накарате една програма да подава друга. Вместо да използва параметрите, въведени от клавиатурата, каналът доставя информацията, генерирана от предишната команда, през този конвейер, представен от |
с примерите ще разберете по-добре. Да предположим, че искате да изброите съдържанието на директория, но ви интересува само да видите имената, които съответстват на думата doc. Така че можете да използвате конвейер, за да насочите изхода на ls към входа на grep филтъра, за да му кажете да показва само тези, които съответстват на този модел:
ls -l | grep doc
Така че вместо да ви показва всички имена, той просто ви показва тези, които наистина ви интересуват. Можете да направите същото със съдържанието на файл. Представете си, че искате да видите само информацията за процесите с име firefox, а не всички:
ps aux | grep firefox
Вместо да показва целия изход на програмата ps на екрана (stdout), това, което прави, е да я насочи към входа на grep филтъра и в изхода показва само това, което съответства на шаблона на firefox в този случай ...
Ако искате, можете да използвате различни тръби за да приведе изхода на една команда към входа на друга втора команда, а изхода на тази втора до входа на трета и т.н. Например:
cat libro | grep love | more
Както виждате, възможностите са много, всичко, което можете да си представите и е позволено. Дори показват само първия и последния ред на файл, преброяват редовете, които влизат в wc, които идват от списъка, и дори ги сортират:
cat listado | head cat listado | tail cat listado | wc -l cat listado | sort
Можете също така да работите с грешки с | & и например потърсете думата предупреждение в изхода на скрипт, ако не успее:
./miscript |& grep alerta
И накрая, има две команди, тясно свързани с тръбите, които са тройник и ксарги и че те могат допълнително да разширят възможностите за тях. В случай на tee, това, което ще позволи, е да покаже резултата от предишната програма на стандартния изход, така че да можете да го видите и в допълнение към това, той може да го насочи към друг файл. Пример може да бъде, ако изброите съдържанието на директория и искате да видите изхода на ls -l в момента и също така да го запазите във файл listing.txt:
ls -l | tee listado.txt
Ако не използвате тройник, няма да можете да видите изхода на конзолата си ...
Y xargs в някои случаи е още по-интересно. В този случай той е в състояние да изгради команда от стандартния вход, който получава през тръбопровода. С други думи, той е способен да улови всичко, което предишна програма е стартирала чрез изхода си и което достига до xargs през конвейера, за да го предаде на свой ред на друга команда като аргументи.
Все още не го разбирате? Ще го видите много по-добре с пример. Представете си, че искате да премахнете всички проклети файлове thumbs.db от директория, диск или дял. Ако са много, може да е невъзможно да преминете един по един с командата rm, за да ги изтриете ръчно. Но с xargs можете да автоматизирате всичко. И можете да го направите с помощта на find, за да ги намерите, изпратете изхода през входа на xargs и това от своя страна ще даде на rm имената като аргументи. Следователно всички разположени ще бъдат изтрити автоматично:
find ./ -name "thumbs.db" | xargs rm
Да предположим например, че търси локали /home/name/thumbs.db, /media/test/thumbs.db и /tmp/thumbs.db. Е, xargs ще ги достави на rm, сякаш са аргументи. Тоест, сякаш бяхме изпълнили: rm /home/name/thumbs.db, след това rm /media/test/thumbs.db и след това rm /tmp/thumbs.db.
Отлично, тази информация е много важна за нас, потребителите на Linux
Каква добра статия в момента, когато изучавам пренасочването на I / O в книгата за командния ред на Linux. По-ясно ми е за тръбите (тръбопровод) и трите потока от данни. Приносът е оценен. Поздравления.
Примерът с xargs ме устройваше като ръкавица. Точно днес се занимавах с онази малка подробност на многократния изход, която трябваше да изпратя „на части“. ксарги разхождаха пинтурита.
Супер благодарен!