次の対話型スクリプトを検討してください。
#!/usr/bin/env bash
set -eu
while true; do
read -p '> '
if [ "$REPLY" == quit ]; then
break
fi
echo "'$REPLY'"
done
expect
今私はそれと対話したいと思います:
#!/usr/bin/env bash
set -eu
echo '
spawn ./1.sh
expect >
send cmd1\n
expect {\n> }
send quit\n
' | expect -d
しかし、実行すると、次のように表示されます。
...
expect: does " cmd1\r\n'cmd1'\r\n> " (spawn_id exp6) match glob pattern "\n> "? no
expect: timed out
send: sending "quit\n" to { exp6 }
なぜ一致しないのですか?新しいプロンプト(コマンド完了)の出現をどのように検出しますか?
ベストアンサー1
言語では、expect
tcl
文字列の使用と引用には違いがあります。次の2つの例でこれを確認できます。""
{}
$ expect -c 'puts "a\nb"'
a
b
~ $ expect -c 'puts {a\nb}'
a\nb
globパターンは、一致{\n> }
するが\n
特別にエスケープされたと解釈されない4つの文字で構成されています。パターンを使用すると、"\n> "
一致が機能します。あるいは、デフォルトのglobパターンの代わりにフラグを使用する-re
こともでき、両方の文字は正規表現コードによってエスケープ文字として解釈されます-re {\n> }
。