22

Вот команда, которая сортирует файлы в папке в обратном порядке

ls | sort -r

Что делает | Символ в этой команде сделать?

То, что я действительно ищу здесь, это объяснение каналов для начинающих Linux высокого уровня (легко понять). Я вижу другие вопросы о каналах здесь, на Superuser, но ничего, что не дает ответа, который объясняет в простых терминах, что они делают и чем они отличаются от перенаправления (символ > или < ).

5 ответов5

27

Если вас устраивает перенаправление вывода и ввода, объяснение действительно довольно простое.

Command1 | Command2

делает так же, как

Command1 > tempfile
Command2 < tempfile

но без tempfile . Выход Command1 напрямую связан с входом Command2 и передача происходит в памяти.

25

Следующее немного упрощено, чтобы помочь новым пользователям.

Ну, во-первых, необходимо понять концепцию стандартного ввода и стандартного вывода.

В Linux и других UNIX-подобных операционных системах каждый процесс имеет стандартный ввод (stdin) и стандартный вывод (stdout). Обычная ситуация такова, что stdin - это ваша клавиатура, а stdout - ваш экран или окно терминала.

Поэтому, когда вы запустите ls , он выдаст свой вывод на стандартный stdout . Если вы больше ничего не сделаете, он перейдет к окну вашего экрана или терминала, и вы увидите его.

Теперь некоторые команды Linux взаимодействуют с пользователем и используют для этого stdin , одним из которых является ваш текстовый редактор. Он читает из стандартного stdin чтобы принять ваши нажатия клавиш, что-то сделать, а затем записывает данные в стандартный stdout .

Однако есть также неинтерактивные или "фильтрующие" команды, которые НЕ работают в интерактивном режиме, но требуют кучу данных. Эти команды возьмут все, что есть у stdin , сделают что-то с ним и затем сгенерируют его в stdout

Давайте посмотрим на другую команду, которая называется du - обозначает использование диска. Например, du /usr выведет (на стандартный stdout как любая другая команда Linux) список всех файлов в этом каталоге и его размер:

# du /usr
2312    /usr/games
124     /usr/lib/tc
692     /usr/lib/rygel-1.0
400     /usr/lib/apt/methods
40      /usr/lib/apt/solvers
444     /usr/lib/apt
6772    /usr/lib/gnash

Как вы можете сразу сказать, он не отсортирован, и вы, вероятно, хотите, чтобы он был отсортирован в порядке размера.

sort - это одна из тех команд "фильтра", которая берет кучу вещей из stdin и сортирует их.

Итак, если мы сделаем это:

# du /usr | sort -nr

мы получаем это, что немного лучше:

4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668  /usr/lib/vmware
501700  /usr/share/locale
366476  /usr/lib/x86_64-linux-gnu
318660  /usr/lib/libreoffice
295388  /usr/lib/vmware/modules
290376  /usr/lib/vmware/modules/binary
279056  /usr/lib/libreoffice/program
216980  /usr/share/icons

И теперь вы можете видеть, что "канал" соединяет стандартный stdout одной команды со стандартным stdin другой. Как правило, вы будете использовать его в таких ситуациях, когда вы хотите фильтровать, сортировать или иным образом манипулировать выводом команды. Они могут быть каскадными, если вы хотите обрабатывать вывод с помощью нескольких команд типа фильтра.

Если вы введете sort самостоятельно, он все равно будет пытаться читать с stdin . Так как stdin подключен к вашей клавиатуре, он будет ждать, пока вы наберете текст и будете его обрабатывать, пока вы не нажмете Control-D. Он не подскажет вам, так как он не предназначен для интерактивного использования.

Для программы возможно определить, является ли stdin интерактивным или нет, поэтому некоторые программы могут действовать по-другому, если вы выдаете их сами или в конце канала.

Кроме того, передача программы, которая работает только в интерактивном режиме, например, vi , приведет к тому, что у вас будут плохие времена.

Каналы отличаются от перенаправления тем, что данные перетасовываются из одной команды в другую, нигде не сохраняясь. Итак, в приведенном выше примере вывод du нигде не сохраняется. Большую часть времени вы не хотите этого с конвейерами, потому что причина использования конвейеров состоит в том, чтобы каким-то образом обрабатывать вывод команды, но есть командный tee который позволяет вам получить свой торт и съесть его тоже. скопирует то, что получает от стандартного stdin в стандартный stdout и файл по вашему выбору Скорее всего, вы также можете сделать это из bash с некоторым загадочным синтаксисом, включающим амперсанды и скобки, о которых я не знаю.

3

На самом деле, если вы хотите знать, что делают каналы, и разницу между> и |, перейдите в каталог с большим количеством файлов, и

с терминала ls против ls | more (или делать это из Windows с помощью DIR и DIR | MORE)

Если вы использовали> more, вы увидите, что он создает файл с именем 'more', а не отправляет вывод ls в команду 'more'. Поэтому, если кто-то сделает> больше, это, вероятно, будет ошибкой, он не сделает> больше, чем вы бы сделали> file1. Больше хорошо известная команда.

<Like> также предназначен для связывания команды и файла, а не команды с командой. Но в то время как> отправляет вывод команды в файл, <отправляет файл в качестве ввода для команды. Я редко использую <, как я обычно использую cat file1 | отправить вывод файла в команду.

$ grep a <file1 abc

$ cat file1 | grep a abc

grep с 2 параметрами имеет вид файла шаблона grep. grep с одним параметром - это шаблон grep. И вы можете отправить ему файл, отправив по нему содержимое файла или используя <. Если вы используете <, вы сначала пишете имя команды, затем имя файла после команды <file. При использовании | чтобы передать содержимое файла, вы используете cat file1 | команда.

Также многие команды в любом случае принимают файл в качестве входных данных, поэтому grep file1 будет работать так же, как cat file1 | grep a и grep a <file1.

Я делал трубы (|) и> на DOS даже 15 лет назад.

Подводя итог, как | отличается от <и> - канал находится между 2 командами. <и> находятся между командой и файлом.> Выводится в файл. <Является вводом из файла.

3

Символ канала (|) соединяет вывод одной программы со входом другой.

В этом примере echo выводит слово hello , а wc -c подсчитывает количество введенных символов:

echo hello | wc -c
2

Чтобы понять это, попробуйте сами:

sort -r

Теперь вы зависаете с курсором, и он ничего не делает. Что произойдет, если вы введете некоторые данные?

1
2
3
5
4

Все еще ничего, верно? Теперь нажмите Ctrl +D

5
4
3
2
1

Итак, что делает сортировка, она берет ввод (то, что вы набрали), что-то делает с ним (сортирует) и возвращает его в качестве вывода. Команда ls не принимает ввод, она только генерирует вывод. Символ канала принимает выходные данные из ls и передает их в качестве входных данных для команды sort .

> не передает вывод в программу, но сохраняет вывод в виде файла. < использует файл в качестве входных данных.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .