Come "dire" aspettare quando viene usato in una serie di pipe?

1

Sto cercando di capire come essere avvisato che sono stati raggiunti più stadi in una serie di comandi inviati.

Per motivi di discussione, diciamo che ho un comando simile in modo che qualsiasi parte di essa potrebbe richiedere molto tempo. Voglio essere avvisato quando ogni "stage" è completato facendo sì che lo script dica qualcosa.

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

dove stage_complete.sh è un semplice script di bash per say il testo dell'argomento e passa lo stdin allo stdout.

stage_complete.sh

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

Questa idea funziona bene - tranne che dire non "aspetta" che la parola termini - inizia a dire la frase, e poi continua immediatamente, quindi se i miei comandi scorrono velocemente, allora dice "netstat" e "grep done" allo stesso tempo, sovrapponendosi a vicenda.

Come posso fare in modo che say aspetti? o farla accodare al testo e dirlo solo una volta completato il testo precedente? Nota che ho notato che comandi come questi si aspettano l'un l'altro per completare:

say one && say two && say three

ma non riesco a vedere come farlo funzionare nei miei tubi!

    
posta Brad Parks 17.11.2016 - 13:57
fonte

1 risposta

1

Ho scoperto che tutto quello che dovevo fare era consumare tutto lo stdin all'inizio del mio script ... Non voglio che stdin venga processato come è stato ricevuto, ma quando l'intero comando precedente nella catena di pipe è completo.

Quindi il mio stage_complete.sh script è semplicemente questo, che funziona per il mio caso d'uso!

stage_complete.sh

#!/usr/bin/env bash

OUT=$(cat -)

MSG="$*"
say "$MSG"

echo "$OUT"

Nota: l'ho capito ponendo la domanda in un altro stack exchange (unix), qui

    
risposta data 14.04.2018 - 13:35
fonte

Leggi altre domande sui tag