Труби: що потрібно знати, щоб почати використовувати їх у GNU / Linux

труби

Una труба або піпe насправді є конвеєром, доступним для UNIX / Linux, і є найбільш практичним. Але щоб повністю зрозуміти, що таке труба, ви повинні знати, що в середовищі * nix у неї є 3 вбудовані потоки даних. Це для тих, хто не знає, означає, що дані можуть подаватися до або з трьох точок.

Тоді ви зрозумієте це краще, але я хочу, щоб вам було зрозуміло зараз, що за допомогою труби ви можете направити канал з одного з цих пунктів на інші. Це дозволяє брати вихідні дані або результати, які програма кидає на вхід іншого для того, щоб той використовував тощо. Я спробую пояснити це на декількох практичних прикладах, які допоможуть вам це дуже добре зрозуміти.

Ті моменти, про які я говорив, або потоки даних, є:

  • stdin: відповідає 0 і є стандартним входом. Як правило, стандартним входом для системи * nix є клавіатура. Тобто те, що ви вводите, буде використаною інформацією. З нею пов’язаний спеціальний пристрій, який є / dev / stdin.
  • stdout: ідентифікується з 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 

І нарешті, є дві команди, тісно пов’язані з цими трубами трійник і ксарги і що вони можуть ще більше розширити їх можливості. Що стосується трійника, те, що він дозволить, - це показати результат попередньої програми на стандартному виводі, щоб ви могли його побачити, а на додаток до цього, він може направити його в інший файл. Прикладом може бути, якщо ви перелічите вміст каталогу і хочете побачити вихідні дані ls -l на даний момент, а також зберегти його у файлі listing.txt:

ls -l | tee listado.txt

Якщо ви не використовуєте трійник, ви не зможете побачити вихідні дані на консолі ...

Y ксарг це навіть цікавіше в деяких випадках. У цьому випадку він може побудувати команду зі стандартного входу, який він отримує через конвеєр. Іншими словами, він здатний захопити все, що попередня програма запустила через свій вихід, і що потрапляє до xargs через конвеєр, щоб передати його по черзі іншій команді як аргументи.

Все ще не розумієте? Ви побачите це набагато краще на прикладі. Уявіть, що ви хочете видалити всі прокляті файли thumbs.db з каталогу, диска чи розділу. Якщо їх багато, можливо, буде неможливо виконати команду rm по черзі, щоб видалити їх вручну. Але за допомогою xargs ви можете автоматизувати все. І ви можете зробити це, використовуючи find, щоб знайти їх, надіслати вихід через вхід xargs, і це, в свою чергу, дасть rm імена як аргументи. Тому всі розташовані будуть видалені автоматично:

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

Наприклад, припустимо, find find знаходить /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.


Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: AB Internet Networks 2008 SL
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   Хосе - сказав він

    Чудово, ця інформація дуже важлива для нас, користувачів Linux

  2.   Данило - сказав він

    Яка гарна стаття, саме зараз, коли я вивчаю переспрямування вводу-виводу в книзі Linux Command Line. Мені зрозуміліше про труби (трубопровід) та три потоки даних. Внесок оцінений. Привітання.

  3.   01101001b - сказав він

    Приклад з ксаргами мені підійшов як рукавичка. Саме сьогодні я мав справу з тією дрібною деталлю багаторазового виходу, яку мені довелося відправити "частинами". ксарг ходив пінтуриту.
    Супер вдячний!