bash - ejecuta cmd2 cada vez que la salida estándar de cmd1 produce una cadena específica


0

Estoy tratando de correr

WID=`xdotool search "Inbox" | head -1`
xdotool windowactivate $WID
xdotool key Up

cada vez stdout de

$ CAMEL_DEBUG=all evolution

cede "inicio inactivo".

He creado este script, que hace lo que quiero, pero solo una vez, no lo hace cada vez que se muestra el "inicio inactivo", sino solo una vez y se detiene. No sé cómo bash lo suficientemente bueno como para obligarlo a repetirse sin cesar.

exec 3< <(CAMEL_DEBUG=all evolution)

while read line; do
   case "$line" in
   *"starting idle"*)
      echo "'$line' contains staring idle"

    WID=`xdotool search "Inbox" | head -1`
        xdotool windowactivate $WID
        xdotool key Up

      break
      ;;
   *)
      echo "'$line' does not contain starting idle."
      ;;
   esac
done <&3

exec 3<&-

Gracias.

Respuestas:


0

los break comando termina el while lazo. Déjalo caer.


Lo sé, esto es solo un ejemplo de lo que funciona, pero solo una vez. Dejar caer el comando de ruptura no es lo suficientemente bueno, por supuesto que lo intenté. Se necesita repetir un cambio más profundo en el script para que se repita infinitamente, pero no sé cómo hacerlo.
cronulis

Si cae break no es suficiente, entonces es probable que sea un problema de almacenamiento en búfer. (Para la mayoría de los comandos, la salida se almacena en búfer a menos que vaya a un terminal). expect Se puede utilizar una herramienta para sortear estos problemas. Echa un vistazo a eso.
Uwe

0

Podrías probar algo un poco más complejo. Primero redirigir la salida de evolution a un archivo:

CAMEL_DEBUG=all evolution > tmpout

Entonces haz un sin fin while bucle que lee el archivo y reacciona si se encuentra una cadena:

#!/usr/bin/env bash
while true; do
    while read line; do
    case "$line" in
        *"starting idle"*)
        echo "'$line' contains staring idle"

        WID=`xdotool search "Inbox" | head -1`
        xdotool windowactivate $WID
        xdotool key Up

        break
        ;;
        *)
        echo "'$line' does not contain starting idle."
        ;;
    esac
    done < tmpout
done
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.