Eu tenho um programa P
que espera receber "Olá" e emitir "Por quê?" antes de fornecer um recurso. Esse recurso é usado por outros programas que não sabem que é uma cortesia comum iniciar uma conversa com "Olá". Assim, eu quero escrever um wrapper para P
que funcione assim (sintaxe 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.
Usar cat
ou dd
na Replace...
parte (algo como cat <&p &; exec cat >&p
) resulta em buffer desnecessário. Quais são as minhas opções?
zsh
solução ou é umabash
solução aceitável?bash
solução que não é aplicável nozsh
, mas certamente aceito-☺ssh
e sua opçãoProxyCommand
.cat
geralmente não faz buffer. Se isso ocorrer no seu sistema, tentecat -u
.Respostas:
O problema que você declarou não é realmente sobre substituir um processo , mas substituir os fluxos de um processo existente . O objetivo é interagir um pouco com o processo e então entregar sua entrada / saída para outro par de fluxos conectados.
Não há como fazer isso diretamente (pelo menos no shell; dentro do processo, é possível que uma
dup2
chamada funcione). Você precisará unir os fluxos. Ou seja:Usar
coproc
como no seu exemplo também é bom. Observe que o comando salva os descritores de arquivo em uma matriz e você pode usá-los posteriormente para redirecionamentos.Isso não deve causar buffer adicional (pelo menos com GNU cat), a menos que P inspecione os fluxos de entrada / saída aos quais está conectado e tome uma decisão de buffer com base nisso. Por exemplo, a biblioteca padrão C ativará o buffer em
stdout
/stderr
se eles estiverem conectados a um arquivo, mas somente realizará o buffer de linha se estiver conectado a um terminal.fonte
Capaz de testar com o código abaixo usando perl para evitar buffer, tente se isso funcionar para você
fonte
dd ibs=1
, por exemplo. Eu não estou bem com isso. De certa forma, o coproc possui seu próprio buffer e é esse que eu quero usar.