![bash 程序在标准输入上看到关键字时执行某些操作](https://linux22.com/image/88064/bash%20%E7%A8%8B%E5%BA%8F%E5%9C%A8%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E4%B8%8A%E7%9C%8B%E5%88%B0%E5%85%B3%E9%94%AE%E5%AD%97%E6%97%B6%E6%89%A7%E8%A1%8C%E6%9F%90%E4%BA%9B%E6%93%8D%E4%BD%9C.png)
假设我有一个可执行文件,它连接到外部机器并在几分钟内将一堆内容输出到标准输出。在该输出的末尾将有一个关键字,例如“STOP”,或 EOF 字符或其他字符。打印该关键字/EOF 后,可执行文件将继续执行,但不再发送任何输出。它不会自行终止。
现在我想将此可执行文件的输出传输到执行此操作的 bash 脚本:
- 读取正在输入的内容并将其全部写入标准输出。
- 当您看到“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 }
...
}