- ベストアンサー
シェルのwhile文を使ってexpect処理
- シェルのwhile文を使ってexpect処理を行いたい場合、以下のようにsuを行い、Passwordプロンプトが返ってきたらinteractで標準入力モードに戻して手入力し、その後にwhile文で後続の処理を実行することができます。
- ただし、上記の処理ではPasswordプロンプトが返ってきた後、通常のプロンプトが返って終了してしまうため、実行結果が思った通りにならないことがあります。
- また、su処理ではなく他の処理で特定の個所のみプロンプトが返ってくる場合には、expectを使わなくても実現できます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
標準入力のファイルディスクリプタを退避して expect の時だけ戻せば大丈夫かも? while read LINE; do : : expect -c "……" 0<&9- : : done 9<&0- 0<$LISTFILE
その他の回答 (2)
- dscripty
- ベストアンサー率51% (166/325)
[ANo.2] のお礼に対する回答ね。 Bash Reference Manual http://www.gnu.org/s/bash/manual/bash.html の 3.6.9 Moving File Descriptors の項目に書かれていて、 シェルの標準入力(ファイルディスクリプタ 0)を 9(あいてる番号なら何でもいい)に移動してから、 『9<&0-』 done の 0 (標準入力) に $LISTFILE をつなぐ。 『0<$LISTFILE』 で、9 に移動しておいた、シェルの標準入力を expect コマンドの標準入力(0)につなげただけ。 『0<&9-』
お礼
ご説明頂きありがとうございます。 そういうことだったんですね。 理解しました。 作りたいものが作成でき満足です。 ありがとうございました。
- dscripty
- ベストアンサー率51% (166/325)
試してないから単なる想像だけど、 while read LINE; do; ... ;done < $LISTFILE してるから expect にとっての標準入力は $LISTFILE だよね。 su コマンドが出力する『Password』をまって、interact してるけど、 ここで spawn した su にとっての標準入力は expect の send コマンドから $LISTFILE に付け替えられることになると思うよ。 で、su は $LISTFILE から受け取った文字列をパスワード文字列をして 読み込んで、最終的に EOF がみつかって、su は終了したんじゃないかな? だから、この目的の場合、 sh コマンドの read で $LISTFILE を読み込むのではなくて expect の中で $LISTFILE を open して、一行ずつ gets して 処理するのが良さそうなきがする。 詳しいコマンドの説明は下のマニュアルで確認できるよ。 『Tcl8.4.1マニュアル 目次』 http://www.freesoftnet.co.jp/tclkits/doc/TclCmdRef/tcl_contents_jp.htm
お礼
やはり、そうですか。 方法がない場合は、そうしようかと思ってました。 実は、実際にやりたいことが別にあると記載しましたが、 例えば、上記のシェルで echo "test"; のあとにまたexpect -cのなんらかの処理がはいるとして 最初のexpectからecho後のexpectまでFILELISTの1行で一処理としてやりたかったのです。 expect内だけ、whileまたはfor文としてしまうと、echo後のexpectも別に ループ処理をさせる必要があるので上記のような質問をさせて頂いておりました。 それなら、全てexpectでやれっていわれそうですが、シェルスクリプトのほうが楽なこともあるのと expectをあまり理解していないので書くのに時間がかかってしまうためです。 回答、ありがとうございます。 参考にさせて頂きます。
お礼
ありがとうございます!!! できました!!!すごいです!!! 因みに0<&9-の意味(調べたのですがわからないです・・・)と 動作(なぜ動くようになったのか)がよくわからないので簡単でいいので教えて頂けますか?