Каналы: что нужно знать, чтобы начать использовать их в GNU / Linux

трубопроводы

Una труба или трубкаНа самом деле e - конвейер, доступный для UNIX / Linux, и очень практичный. Но чтобы полностью понять, что такое канал, вы должны знать, что в среде * nix он имеет 3 встроенных потока данных. Для тех, кто не знает, это означает, что данные могут перемещаться в три точки или из них.

Тогда вы поймете это лучше, но сейчас я хочу пояснить вам, что с помощью пайпа вы можете направить канал от одной из этих точек к другим. Это позволяет принимать выходные данные или результат, которые программа передает на вход другой, для использования этой программой и т. Д. Я постараюсь объяснить это на нескольких практических примерах, которые помогут вам очень хорошо это понять.

Те моменты, о которых я говорил, или потоки данных, являются:

  • STDIN: соответствует 0 и является стандартным вводом. Обычно стандартным вводом для системы * nix является клавиатура. То есть то, что вы вводите, будет использоваться. С ней связано специальное устройство / dev / stdin.
  • стандартный вывод: обозначен цифрой 1, это стандартный вывод. Обычно это соответствует монитору или экрану вашего компьютера, на котором вы можете видеть информацию. Например, когда вы запускаете команду ls, список содержимого будет отображаться на экране, верно? Связанное устройство - / dev / stdout.
  • STDERR: обозначается цифрой 2, это стандартный вывод ошибок, когда в программе возникает ошибка. Связанное устройство - / dev / stderr.

С помощью конвейера вы можете сделать стандартный вывод или стандартный вывод одной команды переходить непосредственно к стандартному вводу другой.. То есть вы можете заставить одну программу кормить другую. Вместо использования параметров, вводимых с клавиатуры, конвейер доставляет информацию, сгенерированную предыдущей командой, через этот конвейер, представленный символом |

В лице примеры вы поймете это лучше. Предположим, вы хотите вывести список содержимого каталога, но вас интересуют только имена, соответствующие слову 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 

И, наконец, есть две команды, тесно связанные с каналами, которые тройник и xargs и что они могут еще больше расширить их возможности. В случае с tee он позволяет отображать результат предыдущей программы в стандартном выводе, чтобы вы могли его видеть, и в дополнение к этому он может передать его в другой файл. Примером может быть, если вы перечисляете содержимое каталога и хотите увидеть вывод ls -l в данный момент, а также сохранить его в файле list.txt:

ls -l | tee listado.txt

Если вы не используете tee, вы не сможете увидеть вывод на консоли ...

Y xargs в некоторых случаях это даже интереснее. В этом случае он может создать команду из стандартного ввода, который он получает через конвейер. Другими словами, он способен захватывать все, что предыдущая программа запустила через свой вывод и что достигает xargs через конвейер, чтобы передать его по очереди другой команде в качестве аргументов.

Все еще не понимаете? Вы увидите это намного лучше на примере. Представьте, что вы хотите удалить все чертовы файлы thumbs.db из каталога, диска или раздела. Если их много, возможно, будет невозможно перейти по одному с помощью команды rm, чтобы удалить их вручную. Но с помощью xargs вы можете все автоматизировать. И вы можете сделать это, используя find, чтобы найти их, отправить вывод через ввод xargs, и это, в свою очередь, даст rm имена в качестве аргументов. Поэтому все найденные будут удалены автоматически:

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

Например, предположим, что 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.


Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

3 комментариев, оставьте свой

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован.

*

*

  1. Ответственный за данные: AB Internet Networks 2008 SL
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   Хосе сказал

    Отлично, эта информация очень важна для нас, пользователей Linux

  2.   Дэниел сказал

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

  3.   01101001b сказал

    Пример с xargs меня устроил как перчатка. Ровно сегодня я имел дело с деталями множественного выхода, которые я должен был отправить «по частям». xargs гулял по пинтурите.
    Супер благодарен!