2

次の bash スクリプト (script.sh) があります。

#!/bin/bash
read -p "Remove? (y|n): " answer
echo "You answered '$answer'."

私はexpectを使ってそれを運転したいと思います。次のスクリプトがあります (expect.exp、同じディレクトリにあります):

#!/usr/bin/expect -f
set timeout -1
spawn -noecho ./script.sh
expect "^Remove"
send "y\r"

しかし、期待どおりに機能しません(しゃれが意図されています)。結果は次のとおりです。

~/Playground$ ./expect.exp 
Remove? (y|n): ~/Playground$

そのため、expect スクリプトは最初の 'expect "^Remove"' 行で何らかの形で失敗し、すぐに終了し、残りの script.sh は実行されません。ここで何が間違っていますか?オンラインで見つけた基本的なチュートリアル (ftp の例を含むもの) に従っています。Kubuntu 12.10でexpect 5.45を使用しています。

編集 したがって、最後に「interact」または「expect eof」を追加すると変更されます。しかし、私は何が起こったのか、そしてその理由はわかりません。何か助けはありますか?

4

2 に答える 2

3

私が見る2つのこと:

  1. "^Remove"は正規表現ですが、デフォルトでexpectは glob パターンを使用します。試す

    expect -re "^Remove"
    
  2. プログラムの開発中exp_internal 1に、スクリプトの先頭に追加します。次に、expect が何が起こっているかを示します。


ああ、expect はTcl の glob パターン^を超えて特別な意味を追加することがわかりました。

ただし、expect は行指向ではないため、これらの文字 (^および$) は、expect マッチング バッファーに現在ある (行ではなく) データの先頭と末尾に一致します。

したがって、送信するy\rと、スクリプトはそれ以上何もすることがないため、終了すると予想されます。スクリプトが終了すると、生成された子プロセスは強制終了されます。したがって、スポーンされた子が最初に終了するのを待つ必要があります。expect eof

于 2013-05-09T10:35:58.317 に答える
0

問題

シェルスクリプトのプロンプトの後にテキストを一致させていないため、生成されたプロセスのバッファーが出力されることはありません。スクリプトが終了し、生成されたプロセスが終了し、それで話は終わりです。

解決

expect特定の応答またはシェル スクリプトの EOFを確認してから、バッファーを出力します。例えば:

#!/usr/bin/expect -f

spawn -noecho   "./script.sh"
expect "Remove" { send "y\r" }
expect EOF      { send_user $expect_out(buffer) }
于 2013-05-09T13:53:25.907 に答える