Mam program, P
który oczekuje na otrzymanie „Cześć” i wyjście „Dlaczego?” przed udostępnieniem funkcji. Ta funkcja jest używana przez inne programy, które nie zdają sobie sprawy z tego, że rozpoczęcie rozmowy z „Cześć” jest powszechne. Dlatego chcę napisać opakowanie, P
które działa w ten sposób (składnia zsh):
coproc P
print -p Hello # Send Hello to P
read -pr line # Read what P has to say
[[ "$line" = "Why?" ]] && Replace current process with the coprocess.
echo Could not get P's attention.
Użycie cat
lub dd
w Replace...
części (coś podobnego cat <&p &; exec cat >&p
) powoduje niepotrzebne buforowanie. Jakie są moje opcje?
zsh
rozwiązanie, czy rozwiązanie jest dobash
przyjęcia?bash
rozwiązaniem, które nie ma zastosowaniazsh
, ale na pewno bym je zaakceptował ☺ssh
i jego opcjaProxyCommand
.cat
generalnie nie buforuje. Jeśli działa w twoim systemie, spróbujcat -u
.Odpowiedzi:
Podany problem nie dotyczy zastąpienia procesu , ale zastąpienia istniejących strumieni procesu . Celem jest trochę interakcji z procesem, a następnie przekazanie jego wejścia / wyjścia innej parze połączonych strumieni.
Nie ma sposobu, aby to zrobić bezpośrednio (przynajmniej w powłoce; wewnątrz procesu możliwe jest, że
dup2
wywołanie może działać). Będziesz musiał podzielić strumienie. To znaczy:Używanie
coproc
jak w twoim przykładzie jest również OK. Zauważ, że polecenie zapisuje deskryptory plików w tablicy i możesz później użyć ich do przekierowań.Nie powinno to powodować dodatkowego buforowania (przynajmniej w przypadku GNU cat), chyba że P sprawdzi strumienie wejściowe / wyjściowe, do których jest podłączony, i na tej podstawie podejmie decyzję o buforowaniu. Na przykład standardowa biblioteka C włączy buforowanie na
stdout
/stderr
jeśli są podłączone do pliku, ale buforowanie linii będzie wykonywane tylko wtedy, gdy jest podłączone do terminala.źródło
W stanie przetestować poniższy kod za pomocą perla, aby uniknąć buforowania, spróbuj, czy to działa dla Ciebie
źródło
dd ibs=1
na przykład używanie . Nie czuję się z tym dobrze. W pewnym sensie coproc ma swoje własne buforowanie i właśnie tego chcę użyć.