1 votos

¿Cómo hacer esperar el "decir" cuando se utiliza en una serie de tuberías?

Estoy tratando de averiguar cómo ser notificado 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 podría tomar mucho tiempo. Quiero ser notificado cuando cada "etapa" se ha completado por tener el script decir algo.

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

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

stage_complete.sh

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

Esta idea funciona bien - excepto que say no "espera" a que la palabra se complete - simplemente empieza a decir la frase, y luego continúa inmediatamente, así que si mis comandos se ejecutan rápidamente, entonces dice "netstat" y "grep done" al mismo tiempo, superponiéndose el uno al otro.

¿Cómo puedo hacer say ¿esperar? o ¿hacer que el texto se ponga en cola y sólo lo diga una vez que el texto anterior haya terminado? He notado que los comandos así esperan a que se completen unos a otros:

say one && say two && say three

pero no veo cómo hacer que eso funcione en mis tuberías.

1voto

NotVonKaiser Puntos 129

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

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

stage_complete.sh

#!/usr/bin/env bash

OUT=$(cat -)

MSG="$*"
say "$MSG"

echo "$OUT"

Nota: Esto lo descubrí haciendo la pregunta en otro intercambio de pilas (unix), aquí

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X