Tengo un programa Pque espera recibir "Hola" y mostrar "¿Por qué?" antes de proporcionar una función. Esta función es utilizada por otros programas que no son conscientes de que es una cortesía común iniciar una conversación con "Hola". Por lo tanto, quiero escribir un contenedor para Pque funcione así (sintaxis 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 cato dden la Replace...parte (algo así como cat <&p &; exec cat >&p) da como resultado un almacenamiento en búfer innecesario. ¿Cuáles son mis opciones?

zshsolución o es unabashsolución aceptable?bashsolución que no es aplicablezsh, pero que ciertamente la aceptaría ☺sshy su opciónProxyCommand.catgeneralmente no amortigua. Si lo hace en su sistema, intentecat -u.Respuestas:
El problema que ha declarado no se trata realmente de reemplazar un proceso , sino de reemplazar las secuencias de un proceso existente . El objetivo es interactuar un poco con el proceso y luego entregar su entrada / salida a otro par de flujos conectados.
No hay forma de hacer esto directamente (al menos, en el shell; dentro del proceso, una
dup2llamada podría funcionar). Tendrá que empalmar las corrientes. Es decir:Usar
coproccomo en su ejemplo también está bien. Tenga en cuenta que el comando guarda los descriptores de archivo en una matriz, y luego puede usarlos para redireccionamientos.Esto no debería causar almacenamiento en búfer adicional (al menos con GNU cat), a menos que P inspeccione los flujos de entrada / salida a los que está conectado y tome la decisión de usar el búfer en función de eso. Por ejemplo, la biblioteca estándar de C habilitará el almacenamiento en búfer en
stdout/stderrsi están conectados a un archivo, pero solo realizará el almacenamiento en búfer de línea si están conectados a un terminal.fuente
Capaz de probar con el siguiente código usando Perl para evitar el almacenamiento en búfer, pruebe si esto funciona para usted
fuente
dd ibs=1, por ejemplo. No estoy bien con esto. En cierto modo, el coproc tiene su propio almacenamiento en búfer, y es este el que quiero usar.