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