ちなみにオリジナルの expect は使ったことがなく、以下の解釈が正しいかどうかはまったく分からないのであしからず。
気をつけることは、
- とにかく一定の順番を見つけること
以下、ハマったところ。
- パターンにマッチしない場合を考えて timeout をセットしないと永遠に終わらない可能性アリ
- パターンにマッチしなかった場合は nil しか得られないので、何の処理に失敗したのかは判別不能
- 正規表現マッチをあまり厳密にしたらまずい?
全部苦労したけど 3 は今でもなんかすっきりする答えを見つけられないでいる。上のコードで prompt を見つける正規表現に $ があったりなかったりするのはそれが理由。基本的には $ まで書いてキッチリ表現したいんだけど、つけるとなぜかマッチしなくなったりして、意味がよく分からないのであまり絞りすぎないことにした。でもそうすると予期しないところにマッチしそうで気持ちよくない。
なんでこんなことしてたかというと、sudo の使えないサーバで root 権限でコマンドを実行したかったから。ほんとは Capistrano で片付くと思っていたけど sudo が使えないということで急遽 expect のお出ましとなった。やってみると実際には expect だけで解決するわけでもなく、なかなか苦労の大きな作業になってしまった。
でもまぁ expect が使えれば自動化できる処理はけっこう増えるわけで、タイミング的にはちょっとつらかったが必要に迫られたおかげでまた一つ幅が広がったと喜んでおくことにした。
cf.