假设我有一个可执行文件,它连接到外部机器并在几分钟内将一堆内容输出到标准输出。在该输出的末尾将有一个关键字,例如“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 }
...
}