Znam dwa typy łączenia poleceń:
- za pomocą potoku (wstawianie wyjścia std do wejścia std następnego polecenia).
- za pomocą trójnika (podziel wyjście na wiele wyników).
Nie wiem, czy to wszystko, co jest możliwe, więc rysuję hipotetyczny typ połączenia:
Jak można wdrożyć cykliczny przepływ danych między poleceniami, na przykład w tym pseudokodzie, w którym zamiast poleceń używam zmiennych:
pseudo-code:
a = 1 # start condition
repeat
{
b = tripple(a)
c = sin(b)
a = c + 1
}
źródło
Ogólnie korzystam z Makefile (polecenie make) i próbuję zmapować twój diagram do reguł makefile.
Aby mieć powtarzalne / cykliczne polecenia, musimy zdefiniować zasadę iteracji. Z:
każdy
make
wytworzy jedną iterację naraz.źródło
make
, ale niepotrzebne: jeśli używasz pliku pośredniego, dlaczego po prostu nie używasz pętli do zarządzania nim?make
dotyczy makr, które są tutaj doskonałą aplikacją.Wiesz, nie jestem przekonany, że koniecznie potrzebujesz powtarzalnej pętli sprzężenia zwrotnego, gdy przedstawiają cię twoje diagramy, na tyle, na ile możesz użyć trwałego potoku między koprocesami . Z drugiej strony może się okazać, że nie ma zbyt dużej różnicy - po otwarciu linii w koprocesie można wdrożyć typowe pętle stylu, po prostu zapisując informacje i odczytując je, nie robiąc nic nadzwyczajnego.
Po pierwsze, wydaje się, że
bc
jest to dla ciebie główny kandydat na koproces. Wbc
możeszdefine
funkcje, które mogą zrobić prawie to, o co prosisz w swoim pseudokodzie. Na przykład niektóre bardzo proste funkcje do wykonania tego mogą wyglądać:... który wydrukowałby ...
Ale oczywiście to nie trwa . Gdy tylko podpowłoka odpowiedzialna za
printf
potok zostanie zamknięta (zaraz poprintf
zapisiea()\n
na rurze), potok zostaje zerwany, abc
wejście zamyka się, a także zamyka. To nie jest tak przydatne, jak mogłoby być.@derobert wspomniał już o FIFO jak można to zrobić, tworząc plik potoku nazwanego za pomocą
mkfifo
narzędzia. Są to w zasadzie tylko potoki, ale jądro systemu łączy wpis systemu plików z obydwoma końcami. Są to bardzo przydatne, ale byłoby miło, gdybyś mógł po prostu mieć fajkę bez ryzyka, że zostanie ona podsłuchana w systemie plików.Tak się składa, że twoja skorupa często to robi. Jeśli używasz powłoki, która implementuje podstawianie procesów , masz bardzo prosty sposób na uzyskanie trwałego potoku - takiego, jaki możesz przypisać procesowi w tle, z którym możesz się komunikować.
W
bash
przykład możesz zobaczyć, jak działa podstawienie procesu:Widzisz, to naprawdę jest zamiana . Podczas rozszerzania powłoka zastępuje wartość odpowiadającą ścieżce do łącza do potoku . Możesz z tego skorzystać - nie musisz ograniczać się do używania tego potoku tylko do komunikowania się z dowolnym procesem w obrębie
()
samego podstawienia ...... które drukuje ...
Teraz wiem, że różne powłoki wykonują proces koprocesowania na różne sposoby - i że istnieje specyficzna składnia
bash
do konfigurowania jednej (i prawdopodobnie także jednejzsh
) - ale nie wiem, jak te rzeczy działają. Po prostu wiem, że można użyć powyższej składni zrobić praktycznie to samo, bez wszystkich żmudną procedurę zarównobash
izsh
- i można to zrobić bardzo podobną cechędash
ibusybox ash
aby osiągnąć ten sam cel z tu-dokumentów (bodash
ibusybox
zrobić tutaj- dokumenty zawierające potoki zamiast plików tymczasowych, jak robią to dwa pozostałe) .Tak więc po zastosowaniu do
bc
...... to jest najtrudniejsza część. A to jest fajna część ...
... które drukuje ...
... i nadal działa ...
... który właśnie trafia mi ostatnią wartość dla
bc
„sa
zamiast wywołaniea()
funkcji go i wydruki zwiększyć ...W rzeczywistości będzie działać, dopóki go nie zabiję i nie zniszczę rur IPC ...
źródło
eval "exec {BCOUT}<>"<(:) "{BCIN}<>"<(:)
Działa również