外部コンピュータに接続し、数分間標準出力で多くのコンテンツを印刷する実行可能ファイルがあるとします。この出力の終わりには、「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 }
...
}