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