Я знаю два типа, как команды могут быть связаны друг с другом:
- используя Pipe (помещая std-output в std-input следующей команды).
- с помощью тройника (разделить выход на несколько выходов).
Я не знаю, возможно ли это все, поэтому я рисую гипотетический тип соединения:
Как можно реализовать круговой поток данных между командами, как, например, в этом псевдокоде, где я использую переменные вместо команд.
pseudo-code:
a = 1 # start condition
repeat
{
b = tripple(a)
c = sin(b)
a = c + 1
}
источник
В общем, я бы использовал Makefile (команда make) и попытался сопоставить вашу диаграмму с правилами makefile.
Чтобы иметь повторяющиеся / циклические команды, нам нужно определить итерационную политику. С:
каждый
make
будет производить одну итерацию за раз.источник
make
, но ненужное: если вы используете промежуточный файл, почему бы просто не использовать цикл для управления им?make
речь идет о макросах, которые здесь идеально подходят.Знаете, я не уверен, что вам обязательно нужен повторяющийся цикл обратной связи, как изображают ваши диаграммы, настолько, насколько возможно вы могли бы использовать постоянный конвейер между сопроцессами . С другой стороны, это может быть не так уж много различий - когда вы открываете строку в сопроцессе, вы можете реализовать типичные циклы стилей, просто записывая информацию и читая информацию из нее, не делая ничего необычного.
Во-первых, может показаться, что
bc
для вас это главный кандидат на сопроцесс. Вbc
вы можетеdefine
функции , которые могут сделать очень многое , что вы просите в вашем псевдокод. Например, некоторые очень простые функции для этого могут выглядеть так:... который будет печатать ...
Но, конечно, это не последний . Как только подоболочка, отвечающая за
printf
канал, завершает работу (сразу послеprintf
записиa()\n
в канал), канал разрушается, иbc
ввод закрывается, и он также завершает работу. Это не так полезно, как могло бы быть.@derobert уже упомянул FIFO, что можно сделать, создав файл именованного канала с помощью
mkfifo
утилиты. По сути, это также просто каналы, за исключением того, что ядро системы связывает запись файловой системы с обоих концов. Они очень полезны, но было бы лучше, если бы вы могли просто иметь канал, не рискуя получить его в файловой системе.Как это бывает, ваша оболочка делает это много. Если вы используете оболочку, которая реализует подстановку процессов, то у вас есть очень простые способы получения прочного канала - такого типа, который вы можете назначить фоновому процессу, с которым вы можете общаться.
В
bash
, например, вы можете увидеть , как заместительная процесс работы:Вы видите, что это действительно замена . Оболочка заменяет значение во время расширения, которое соответствует пути к ссылке на канал . Вы можете воспользоваться этим - вам не нужно ограничивать использование этого канала только для связи с любым процессом, выполняемым внутри самой
()
замены ...... который печатает ...
Теперь я знаю, что разные оболочки выполняют процесс сопроцессора по-разному, и что существует специальный синтаксис
bash
для его настройки (и, вероятно,zsh
также для), но я не знаю, как эти вещи работают. Я просто знаю , что вы можете использовать приведенные выше синтаксис делать практически то же самое , не все канитель в обоихbash
иzsh
- и вы можете сделать очень похожую вещь вdash
иbusybox ash
для достижения той же цели с здесь-документов (потому чтоdash
иbusybox
делать здесь- документы с конвейерами, а не временные файлы, как у двух других) .Итак, применительно к
bc
...... это сложная часть. И это самое интересное ...
... который печатает ...
... и он все еще работает ...
... который просто возвращает мне последнее значение для
bc
sa
вместо вызоваa()
функции для его увеличения и печатает ...Фактически, он будет продолжать работать, пока я не убью его и не разорву его каналы IPC ...
источник
eval "exec {BCOUT}<>"<(:) "{BCIN}<>"<(:)
работает