Tengo un programa P
que 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 P
que 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 cat
o dd
en 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?
zsh
solución o es unabash
solución aceptable?bash
solución que no es aplicablezsh
, pero que ciertamente la aceptaría ☺ssh
y su opciónProxyCommand
.cat
generalmente 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
dup2
llamada podría funcionar). Tendrá que empalmar las corrientes. Es decir:Usar
coproc
como 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
/stderr
si 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.