Вот команда, которая сортирует файлы в папке в обратном порядке
ls | sort -r
Что делает |
символ в этой команде?
То, что я действительно ищу здесь, это объяснение каналов для начинающих Linux высокого уровня (легко понять). Я вижу другие вопросы о каналах здесь, на Superuser, но ничего, что дает ответ, который объясняет простыми словами, что они делают и чем они отличаются от перенаправления ( символ >
или <
).
linux
command-line
bash
pipe
ccalvert
источник
источник
|
- это то, что он не использует имя, вывод из команды l-hand передается непосредственно на вход для команды на правой стороне канала.ls -1r
(Обратите внимание на аргумент номер один) должен дать аналогичный результатls | sort -r
.cat /somefile | grep cool
. Это возьмет вывод somefile и сделает его доступным для grep, а затем grep напечатает все строки со словом cool в нем.Ответы:
Следующее немного упрощено, чтобы помочь новым пользователям.
Ну, во-первых, необходимо понять концепцию стандартного ввода и стандартного вывода.
В Linux и других UNIX-подобных операционных системах каждый процесс имеет стандартный ввод (
stdin
) и стандартный вывод (stdout
). Обычная ситуация - этоstdin
ваша клавиатура иstdout
экран или окно терминала.Поэтому, когда вы запустите
ls
, он выдаст свой вывод вstdout
. Если вы ничего не сделаете, он перейдет к окну вашего экрана или терминала, и вы увидите его.Теперь некоторые команды Linux взаимодействуют с пользователем и используют
stdin
для этого ваш текстовый редактор. Он читает от,stdin
чтобы принять ваши нажатия клавиш, делать что-то, а затем записывает вещи вstdout
.Однако существуют также неинтерактивные или «фильтрующие» команды, которые НЕ работают в интерактивном режиме, но требуют кучу данных. Эти команды возьмут все
stdin
, что имеют, сделают что-то с этим, и затем бросят это кstdout
Давайте посмотрим на другую команду, которая называется
du
- обозначает использование диска.du /usr
например, распечатает (stdout
как и любая другая команда Linux) список каждого файла в этом каталоге и его размер:Как вы можете сразу сказать, он не отсортирован, и вы, вероятно, хотите, чтобы он был отсортирован в порядке размера.
sort
это одна из тех команд «фильтра», которая берет кучу вещейstdin
и сортирует их.Итак, если мы сделаем это:
# du /usr | sort -nr
мы получаем это, что немного лучше:
И теперь вы можете видеть, что «труба» соединяет
stdout
одну команду сstdin
другой. Как правило, вы будете использовать его в таких ситуациях, когда вы хотите фильтровать, сортировать или иным образом манипулировать выводом команды. Они могут быть каскадными, если вы хотите обработать вывод с помощью нескольких команд типа фильтра.Если вы печатаете
sort
самостоятельно, он все равно будет пытаться читать сstdin
. Посколькуstdin
он подключен к вашей клавиатуре, он будет ждать, пока вы наберете текст и будете его обрабатывать, пока вы не нажмете Control-D. Он не подскажет вам, поскольку он не предназначен для интерактивного использования.Для программы возможно определить,
stdin
является ли она интерактивной или нет, поэтому некоторые программы могут действовать по-другому, если вы запускаете их сами или в конце канала.Кроме того, передача программы, которая работает только в интерактивном режиме, например
vi
, приведет к тому, что у вас будет плохое время.Каналы отличаются от перенаправления тем, что данные перетасовываются из одной команды в другую, нигде не сохраняясь. Итак, в приведенном выше примере,
du
вывод не хранится нигде. Большую часть времени вы не хотите этого с конвейерами, потому что причина использования конвейеров состоит в том, чтобы каким-то образом обрабатывать вывод команды - но есть команда,tee
которая позволяет вам получить свой торт и съесть его, он будет скопируйте то, что он получает,stdin
в обаstdout
файла и файл по вашему выбору. Вы также можете сделать это сbash
помощью некоторого загадочного синтаксиса, включающего амперсанды и скобки, о которых я не знаю.источник
stdin
иstdout
отличается от нее по сравнению с Linux, хотя, вероятно, не очень с точки зрения Windowscmd.exe
или Powershell.GetStdHandle()
. Кроме того, тривиально перенаправить стандартные потоки порожденного [дочернего] процесса с помощью .NET, который, как я считаю, соответствует функциям Win32 (но я не уверен на 100% - я не разработчик Win32).STARTUPINFO
структуре дляCreateProcess()
.Если вас устраивает перенаправление вывода и ввода, объяснение действительно довольно простое.
делает так же, как
но без
tempfile
. ВыходCommand1
напрямую связан с входомCommand2
и передача происходит в памяти.источник
CreateFile
илиWriteFile
звонках, чтобы подтвердить вашу претензию. / edit: Это для Windows, конечно.На самом деле, если вы хотите знать, что делают каналы, и разницу между> и |, перейдите в каталог с большим количеством файлов, и
из терминала
ls
противls | more
(или делать это из Windows с DIR и DIR | MORE)Если вы использовали> more, вы увидите, что он создает файл с именем 'more', а не отправляет вывод ls в команду 'more'. Поэтому, если кто-то сделает> больше, это, вероятно, будет ошибкой, он не сделает> больше, чем вы бы сделали> file1. More - это хорошо известная команда.
<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 командами. <и> находятся между командой и файлом. > Выводится в файл. <Является вводом из файла.
источник
Символ pipe (
|
) соединяет вывод одной программы со входом другой.В этом примере
echo
печатает словоhello
иwc -c
подсчитывает количество введенных символов:источник
Чтобы понять это, попробуйте сами:
Теперь вы зависаете с курсором, и он ничего не делает. Что произойдет, если вы введете некоторые данные?
Все еще ничего, верно? Теперь нажмите Ctrl + D
Итак, что делает сортировка, она берет ввод (то, что вы ввели), что-то делает с ним (сортирует) и возвращает его в качестве вывода. Команда
ls
не принимает ввод, она только генерирует вывод. Символ канала принимает выходные данныеls
и передает их в качестве входных данных дляsort
команды.>
не передает вывод в программу, но сохраняет вывод в виде файла.<
использует файл в качестве входных данных.источник