Come collegare correttamente l'output in "say" nel terminale

4

Mi sono reso conto che il comando say può essere ottimo se combinato con un altro comando / programma perché può leggere l'output. Ho provato a reindirizzare l'output da leave a say digitando quanto segue nel terminale, ma non ha funzionato.

leave +5 | say

Qual è il modo corretto per farlo?

    
posta styfle 06.03.2011 - 01:37
fonte

4 risposte

7

In base alla risposta di mankoff, funziona:

leave +1 2>&1 | while read line ; do echo $line | say ; done

sebbene non lasci più spazio sullo sfondo e ti permetta di continuare a scrivere. Allo stesso modo:

leave +1 2>&1 | while read line ; do echo $line | say ; done &

lo farà svanire in background, ma parlerà anche un numero ID di processo (innocuo). Quindi nessuno dei due è perfetto, ma entrambi funzionano.

(Stavo cercando una soluzione per:

ping google.com | say

che soffre di un problema simile e qualcuno ha suggerito quanto sopra come soluzione. Non ho aggiunto questo come commento alla risposta di mankoff perché non riesco a capire come inserire spazi e newline nei commenti.)

    
risposta data 08.03.2011 - 01:56
fonte
7

Il tuo esempio è, in generale, il modo corretto di convogliare l'output normale per dire:

 cat file | say
 echo "hello world" | say

Il problema specifico è che il carattere | (pipe) trasferisce STDOUT dal comando a sinistra a STDIN al comando a destra. say quindi parla di tutto ciò che è su STDIN .

Tuttavia, leave non stampa l'output direttamente su STDOUT . Può utilizzare STDERR o qualche altro meccanismo di messaggio. È possibile reindirizzare STDERR a | , ma la sintassi dipende dalla shell. Per bash , lo faresti in questo modo, anche se non sono sicuro che questo renderà leave funzionante con say , poiché non mi interessa molto di leave .

cmd 2>&1 |cmd2
    
risposta data 06.03.2011 - 03:28
fonte
2

In aggiunta a questo - se vuoi canalizzare un file in corso per dire, anche la "ricetta" funziona con tail:

tail -f ~/Documents/activity.log | while read line ; do echo $line | say ; done
    
risposta data 07.01.2014 - 14:24
fonte
0

Penso che semplicemente non puoi usare leave per quello, piuttosto usa sleep con la quantità corretta di secondi (mettilo in uno script breve per convertire secondi in minuti, ore):

sleep 60 && say -v Vicki 'Time to leave!' &
    
risposta data 06.03.2011 - 01:54
fonte

Leggi altre domande sui tag