bash - выполнять cmd2 каждый раз, когда cmd1 stdout выдает определенную строку

bash - выполнять cmd2 каждый раз, когда cmd1 stdout выдает определенную строку

Я пытаюсь бежать.

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

каждый раз, когда stdout

$ CAMEL_DEBUG=all evolution

выдает «запуск холостого хода».

Я придумал этот скрипт, который делает то, что я хочу, но только один раз, он не делает это каждый раз, когда отображается "starting idle", а только один раз и останавливается. Я не знаю bash достаточно хорошо, чтобы заставить его повторяться бесконечно.

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<&-

Спасибо.

решение1

Команда breakзавершает whileцикл. Отбросьте ее.

решение2

Вы можете попробовать что-то более сложное. Сначала перенаправьте вывод evolutionв файл:

CAMEL_DEBUG=all evolution > tmpout

Затем создайте бесконечный whileцикл, который считывает файл и реагирует, если найдена строка:

#!/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

Связанный контент