¿Cómo tener que "decir" esperar cuando se usa en una serie de tuberías?

1

Estoy tratando de averiguar cómo recibir una notificación de que se han alcanzado varias etapas en una serie de comandos canalizados.

Por el bien de la discusión, digamos que tengo un comando como para que cualquier parte de él pueda tomar mucho tiempo. Quiero que se me notifique cuando se complete cada "etapa" haciendo que el script diga algo.

netstat -a | stage_complete.sh "netstat" | grep -v WAIT | stage_complete.sh "grep done"

donde stage_complete.sh es un script bash simple para say el texto del argumento, y pasa stdin a stdout.

stage_complete.sh

OUT=$*
say "$OUT"
cat /dev/stdin

Esta idea funciona bien, excepto que, por ejemplo, "no espera" a que se complete la palabra; simplemente comienza a decir la frase, y luego continúa de inmediato, así que si mis comandos se ejecutan rápidamente, dice "netstat" y "grep done" al mismo tiempo, se superponen entre sí.

¿Cómo puedo hacer que say espere? ¿O tiene que poner en cola el texto y solo decirlo una vez que el texto anterior se haya completado? Tenga en cuenta que me he dado cuenta de que los comandos como así se esperan unos a otros para completarse:

say one && say two && say three

¡pero no puedo ver cómo hacer que funcione en mis tuberías!

    
pregunta Brad Parks 17.11.2016 - 13:57

1 respuesta

1

Resulta que todo lo que tenía que hacer era consumir todos los stdin al inicio de mi script ... No quiero que procese el stdin como se recibe, sino cuando se completa todo el comando anterior en la cadena de tuberías.

¡Así que mi script stage_complete.sh es simplemente esto, lo que funciona para mi caso de uso!

stage_complete.sh

#!/usr/bin/env bash

OUT=$(cat -)

MSG="$*"
say "$MSG"

echo "$OUT"

Nota: Descubrí esto haciendo la pregunta en otro intercambio de pila (unix), aquí

    
respondido por el Brad Parks 14.04.2018 - 13:35

Lea otras preguntas en las etiquetas