bash - cmd1 stdout が特定の文字列を生成するたびに cmd2 を実行します。

bash - cmd1 stdout が特定の文字列を生成するたびに cmd2 を実行します。

走ろうとしている

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

毎回stdoutの

$ CAMEL_DEBUG=all evolution

「アイドル開始」になります。

私はこのスクリプトを思いつきました。これは私が望むことを実行しますが、1 回だけ実行します。「アイドルを開始しています」と表示されるたびに実行するのではなく、1 回だけ実行して停止します。私は 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

関連情報