Forums: Forum d’aide (Thread #35985)

waitregexとrecvlnを続けて書いた場合、waitregexが無限待ちとなる (2014-09-16 22:04 by reghorn #74407)

==========================================================

;; 接続先ホスト/ユーザ名/パスワード設定
HOSTADDR = '<接続先IPアドレス>'
USERNAME = '<接続先ユーザ名>'
PASSWORD = '<接続先パスワード>'
;==============================================
;; ①コマンド組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD

;; ②接続
connect COMMAND

;; ③マクロ本文
wait 'root@'
sendln 'true;echo "STATUS:$?"'
waitregex '^STATUS'
recvln ;これを消すと動く
messagebox inputstr param1
end

==========================================================

お世話になります。

上記のように、waitregexのあとにrecvlnを書くと、waitregexで無限待ちになります。
現象として、後ろに書いたコマンドが原因で先行のwaitregexで無限待ちになるのが理解できないのですが、こちらどのような理由によるものでしょうか。
上記コードの意図としては、元々waitの後にrecvlnを2回書いてinputstrとの文字列比較で処理分けしていたものについて、waitでうまく止まらない場合が散見されたため、waitregexで置き換えようとしたものです。
waitregexでマッチ行がinputstrに入るのでrecvlnがなくても上記処理が可能なことは認識しています。

■環境情報
接続先OS :Cent OS 6.5
Teratermバージョン :4.78

以上、よろしくお願い致します。

Re: waitregexとrecvlnを続けて書いた場合、waitregexが無限待ちとなる (2014-09-16 22:55 by (del#1144) #74408)

inputstr に "STATUS:0" とそれに続く改行記号 まで入っていると思います。
次の行でプロンプトが表示され入力待ちになっているところで recvln しても、なにか入力して改行が発生しないとずっと待ったままになります。

===
sendln 'true;echo "STATUS:$?"'
waitregex '^STATUS'
messagebox inputstr matchstr
strlen inputstr
len = result
for i 1 len
strcopy inputstr i 1 sub
str2code c sub
messagebox sub c
next
Répondre à #74407

Re: waitregexとrecvlnを続けて書いた場合、waitregexが無限待ちとなる (2014-09-16 23:09 by reghorn #74409)

[メッセージ #74408 への返信]
> 次の行でプロンプトが表示され入力待ちになっているところで recvln しても、なにか入力して改行が発生しないとずっと待ったままになります。
==========================================================
;; ③マクロ本文
wait 'root@'
sendln 'true;echo "STATUS:$?"'
waitregex '^STATUS' ;waitで止まらない場合があるのでwaitregexで置き換え
messagebox inputstr param1
recvln ;これを消すと動く
recvln ;これを消すと動く
messagebox inputstr param1
end
==========================================================

回答ありがとうございます。
結果として、waitregexで待っているわけではなく、recvlnで待ちになっているようでした。
上記のコードで1つ目のウィンドウが表示された後に、エンターを2回入力することで2つ目のウィンドウが表示されることが確認できました。

「MACRO - <マクロファイル名>」のウィンドウ(中断・終了ボタンがあるウィンドウ)下部に表示されたコマンドがwaitregexになっていたので、そこで待ちになっているのだと思ったのですが違ったようです。

以上、よろしくお願い致します。
Répondre à #74408

Re: waitregexとrecvlnを続けて書いた場合、waitregexが無限待ちとなる (2014-09-17 10:29 by doda #74410)

[メッセージ #74408 への返信]
> inputstr に "STATUS:0" とそれに続く改行記号 まで入っていると思います。
> 次の行でプロンプトが表示され入力待ちになっているところで recvln しても、なにか入力して改行が発生しないとずっと待ったままになります。

wait した後に recvln した場合は wait で待った文字列が含まれる行が取れますが、waitregex の場合はマッチした文字列の次の行が取れますよね。
これ、なんで動作を変えているんでしたっけ?
wait と waitregex で動作が違うのははまりどころだと思います。
Répondre à #74408

Re: waitregexとrecvlnを続けて書いた場合、waitregexが無限待ちとなる (2014-09-17 12:05 by (del#1144) #74411)

> wait した後に recvln した場合は wait で待った文字列が含まれる行が取れますが、waitregex の場合はマッチした文字列の次の行が取れますよね。
> これ、なんで動作を変えているんでしたっけ?
> wait と waitregex で動作が違うのははまりどころだと思います。
waitregex は wait ではなく waitln の仕様と実装をベースにしているのではないでしょうか。

==
cmd = 'true;echo "STATUS:$?"'
sendln cmd
wait 'STATUS:0'
messagebox '' result
recvln
messagebox inputstr ''

sendln cmd
waitln 'STATUS:0'
messagebox inputstr result
recvln ; 何もしないと進まない
messagebox inputstr ''

sendln cmd
waitregex '^STATUS'
messagebox inputstr result
recvln ; 何もしないと進まない
messagebox inputstr ''
==

もしかして waitregexln と命名したほうがよかった?
Répondre à #74410