unix/linux コマンドのexpectを初めて使う者です。上手く操作できないので質問させてください。

まず問題を限定するために、仮に以下の内容を持つrubyスクリプト「a.rb」を事前に用意したことにします。

STDOUT << 'Overwrite /opt/rails/rails_app/Gemfile? (enter "h" for help) [Ynaqdh] '
s = STDIN.gets
STDOUT << s

これを実行すると、プログラムはユーザーに入力を促すプロンプトを出し、入力があるとそれを表示して終わります。

$ruby a.rb
Overwrite /opt/rails/rails_app/Gemfile? (enter "h" for help) [Ynaqdh] #ここでユーザー入力待ちになる
y  # 入力+Enterキー押下で、入力した内容を出力してプログラムを終了する

以上のスクリプトファイルを前提に、expect を使って自動化を試みようと以下のスクリプトファイル(a.expect)を作成しました。

spawn ruby a.rb
expect "Overwrite /opt/rails/rails_app/Gemfile\? \(enter \"h\" for help\) \[Ynaqdh\] "
sleep 3
send "y\r"

これを実行するとプロンプトが出た後、何も起きずにコマンド実行がタイムアウトで終了してしまいます。

$ expect -f a.expect
spawn ruby a.rb
Overwrite /opt/rails/rails_app/Gemfile? (enter "h" for help) [Ynaqdh] 
$  # <= 終了してる!

明らかにスクリプト(a.expect)に問題があるのだろうとは思うのですが、正直何が悪いのかわかりません。
エスケープしないといけない文字があるとかないとか、いくつかのサイトで見た範囲のことを、あまり意味が理解できないまま使っているからだとは思うのですが、manページを見ても要領が得られず、理解に苦しんでいます。アドバイスよろしくお願いします。