bash 程序在标准输入上看到关键字时执行某些操作

bash 程序在标准输入上看到关键字时执行某些操作

假设我有一个可执行文件,它连接到外部机器并在几分钟内将一堆内容输出到标准输出。在该输出的末尾将有一个关键字,例如“STOP”,或 EOF 字符或其他字符。打印该关键字/EOF 后,可执行文件将继续执行,但不再发送任何输出。它不会自行终止。

现在我想将此可执行文件的输出传输到执行此操作的 bash 脚本:

  1. 读取正在输入的内容并将其全部写入标准输出。
  2. 当您看到“STOP”一词(或者可能是字符 EOF)时,终止可执行文件。

我可以使用 pkill 来终止可执行文件。我也许可以使用 tee 和 grep 的某种组合,但是一旦我在 grep 上得到匹配,我不知道该怎么做。

答案1

在脚本本身中需要一个重定向技巧:

#!/bin/bash

exec 1> >(tee >(awk '/STOP/{system("kill '"$$"'")}'))

while read line; do
  echo $line
  sleep 1
done

从那时起:

bash-4.1$ (echo can; echo t; echo STOP; echo believing) | bash datscript

另一种选择可能是expect,例如

#!/usr/bin/env expect
spawn thatconnectingexecutablething
set timeout 7
expect {
  -ex "STOP" { exit 1 }
  eof { exit 1 }
  timeout { exit 1 }
  ...
}

相关内容