Я провел исследование на этом, нашел это, но оно не отвечает на мой вопрос.
Я знаю, что синтаксис expression1 | expression2
средства берут то, что результат expression1, и подайте его к expression2.
Теперь, семантически, это должно совпасть с expression2
expression1
- просто взять результат expression1 и предоставить его явно expression2 как аргумент. Однако это не работает.
В программировании, если Вы имеете print(2+4)
, сначала 2+4
вычисляется, и это затем печатается. Понятие кажется тем же здесь.. но нет. Кажется, что я не понимаю что-то довольно ясное. Любое хорошее разъяснение этого очень ценилось бы.
Результатом и выводом являются различные понятия.
command1 | command2
Берет вывод command1 и подает его к входу command2.
command2 command1
Выполнения command2 с одним аргументом, строка "command1". Это - определенно не то же самое.
Канал может быть заменен Заменой Процесса и Перенаправлением, все же. Это, вероятно, что Вы вообразили:
command2 < <(command1)
<
означает, "читает вход отсюда", и <(...)
выполняет вложенную команду (команды) и создает "имя файла", которое может быть считано из.
Здесь есть две очень разные концепции, даже если они обе могут использоваться для передачи данных программе:
аргументы команды : это массив / список строк которые доступны программе при ее запуске, к ним можно получить доступ (в любом порядке), просто указав ссылку на память. Но они должны существовать до запуска программы, а их общий размер ограничен (около 2 МБ IIRC). В оболочке они передаются следующим образом:
команда arg1 arg2 arg3 ...
стандартный ввод (также известный как stdin ): это входной поток, доступ к которому осуществляется с помощью файловых операций, и его необходимо читать последовательно (без «произвольного доступа»). Но его размер потенциально бесконечен, и данные могут быть добавлены к нему во время работы программы, которая его читает. Есть много способов предоставить программе стандартный ввод, два из них наиболее частые:
команда <файл
command1 | command2
Эти два метода могут сосуществовать, аргументы обычно используются, чтобы указать, как обрабатывать (например, параметры сортировки), в то время как stdin указывает, что обрабатывать (данные для сортировки).
Это оболочка, которая предоставляет аргументы программе, поэтому аргументы должны существовать в виде строк в данных оболочки.По сути, для stdin оболочка просто играет с дескрипторами файлов, но не видит данных.
В оболочке часто есть способ преобразовать вывод какой-либо команды в одну строку для оболочки, в bash вы используете синтаксис $ (...)
:
string_variable=$(command1 arg1 arg2)
You также будут отображаться обратные кавычки, но это устарело:
string_variable=`command1 arg1 arg2`
Таким образом, вы можете передать вывод команды в качестве аргумента другой:
string_variable=$(command1 arg1 arg2)
command2 $string_variable
Но вы также можете пропустить промежуточную переменную и использовать более прямую:
command2 $(command1 arg1 arg2)
Последнее замечание: С помощью command1 | command2
две команды выполняются параллельно (если передано достаточно данных) и шагают друг за другом, в то время как в command2 $ (command1)
, command1
завершается до вызова command2
.