Cómo canalizar correctamente la salida a "decir" en la terminal

4

Me di cuenta de que el comando say puede ser excelente cuando se combina con otro comando / programa porque puede leer la salida. Intenté canalizar la salida de leave a say escribiendo lo siguiente en el terminal, pero no funcionó.

leave +5 | say

¿Cuál es la forma correcta de hacer esto?

    
pregunta styfle 06.03.2011 - 01:37

4 respuestas

7

Basado en la respuesta de mankoff, esto funciona:

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

aunque la licencia ya no se desvanece en el fondo y te permite seguir escribiendo. Del mismo modo:

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

hará que desaparezca en segundo plano, pero también hablará un número de ID de proceso (inofensivo) también. Así que ninguno de los dos es perfecto, pero ambos funcionan.

(Estaba buscando una solución para:

ping google.com | say

que sufre un problema similar, y alguien sugirió lo anterior como una solución. No agregué esto como un comentario a la respuesta de mankoff porque no puedo averiguar cómo poner espacios y nuevas líneas en los comentarios.).

    
respondido por el TessellatingHeckler 08.03.2011 - 01:56
7

Su ejemplo es, en general, la forma correcta de canalizar la salida normal para decir:

 cat file | say
 echo "hello world" | say

El problema específico es que el carácter | (pipe) transfiere STDOUT del comando de la izquierda al STDIN al comando de la derecha. say luego habla lo que está en STDIN .

Sin embargo, leave no imprime la salida directamente a STDOUT . Está utilizando STDERR , o algún otro mecanismo de mensaje. Puede canalizar STDERR a través de | , pero la sintaxis es dependiente de la shell. Para bash , lo harías así, aunque no estoy seguro de que esto haga que leave funcione con say , ya que no mucho sobre leave .

cmd 2>&1 |cmd2
    
respondido por el user588 06.03.2011 - 03:28
1

Como una adición a esto, si desea canalizar un archivo en curso para decir, la "receta" también funciona con cola:

tail -f ~/Documents/activity.log | while read line ; do echo $line | say ; done
    
respondido por el 365nice 07.01.2014 - 14:24
0

Creo que simplemente no puede usar leave para eso, en lugar de usar sleep con la cantidad correcta de segundos (póngalo en un script corto para convertir segundos a minutos, horas):

sleep 60 && say -v Vicki 'Time to leave!' &
    
respondido por el Asmus 06.03.2011 - 01:54

Lea otras preguntas en las etiquetas