Альтернатива для оператора (I) канала

Я провел исследование на этом, нашел это, но оно не отвечает на мой вопрос.

Я знаю, что синтаксис expression1 | expression2 средства берут то, что результат expression1, и подайте его к expression2.

Теперь, семантически, это должно совпасть с expression2 expression1 - просто взять результат expression1 и предоставить его явно expression2 как аргумент. Однако это не работает.

В программировании, если Вы имеете print(2+4), сначала 2+4 вычисляется, и это затем печатается. Понятие кажется тем же здесь.. но нет. Кажется, что я не понимаю что-то довольно ясное. Любое хорошее разъяснение этого очень ценилось бы.

-1
задан 16 March 2020 в 22:34

2 ответа

Результатом и выводом являются различные понятия.

command1 | command2

Берет вывод command1 и подает его к входу command2.

command2 command1

Выполнения command2 с одним аргументом, строка "command1". Это - определенно не то же самое.

Канал может быть заменен Заменой Процесса и Перенаправлением, все же. Это, вероятно, что Вы вообразили:

command2 < <(command1)

< означает, "читает вход отсюда", и <(...) выполняет вложенную команду (команды) и создает "имя файла", которое может быть считано из.

3
ответ дан 17 March 2020 в 00:00

Здесь есть две очень разные концепции, даже если они обе могут использоваться для передачи данных программе:

  1. аргументы команды : это массив / список строк которые доступны программе при ее запуске, к ним можно получить доступ (в любом порядке), просто указав ссылку на память. Но они должны существовать до запуска программы, а их общий размер ограничен (около 2 МБ IIRC). В оболочке они передаются следующим образом:

     команда arg1 arg2 arg3 ...
    
  2. стандартный ввод (также известный как 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 .

3
ответ дан 16 March 2020 в 23:22

Другие вопросы по тегам:

Похожие вопросы: