Следующее немного упрощено, чтобы помочь новым пользователям.
Ну, во-первых, необходимо понять концепцию стандартного ввода и стандартного вывода.
В 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
с некоторым загадочным синтаксисом, включающим амперсанды и скобки, о которых я не знаю.