• ベストアンサー
  • 困ってます

ttlで戻り値を取得する方法

  • 質問No.8275608
  • 閲覧数15508
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 40% (2/5)

Teratermmacroでローカル(cygwin)に入り、サーバ(HP-UX)にリモートで入った後、
コマンドの戻り値で後の行動を操作したいのですが、うまくいきません。
わかる方、教えていただけませんか。

ざっくり以下のようなマクロを組んでいます。

----------------------------------------------------------
sendln 'ssh name@host1'

wait Prompt
sendln 'sendmsg "test"'(のようなコマンド) ←これの戻り値がほしい

if 戻り値 = 0 then
 ○○
elseif 戻り値 = 1 then
 wait Prompt
 sendln 'exit'
 wait Prompt
 sendln 'ssh name2@host2'

以下略
----------------------------------------------------------

上記の「戻り値」をどのようにすれば戻り値で判別してくれるでしょうか。
if文の条件式を $?やresultでやりましたが、どのような戻り値でも
必ず$?は0、resultは1で固定でした。

また、sendmsgとif文の間に以下のように試しましたが、失敗しました。
例1:
----------------------------------------------------------
sendln 'echo $?'
recvln

if inputstr = 0 then ←syntax errorになります。
 ○○
elseif inputstr = 1 then
----------------------------------------------------------

例2:http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1247390747参照
----------------------------------------------------------
sendln 'echo $?'
recvln
recvln

hensu=inputstr ←Type mismatch.のエラーになる。 直前にstr2intを入れたりしても駄目でした。
ちなみにsendln 'echo $?'を挟まずsendmsgの直後にrecvlnでも駄目です。

if hensu = 0 then
 ○○
elseif hensu = 1 then
----------------------------------------------------------

host1にシェルスクリプトを入れることは出来ません。

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 55% (1857/3366)

基本方針は、echo $? の出力文字をttlで受信して判定、でいいと思います。

・inputstrは文字列なので、=での比較はできません
strcompareコマンドで比較→変数resultで判定
あるいは
str2int 変数 intputstr で変数に数値化→if 変数=0 等と判定
ということになります。
http://ttssh2.sourceforge.jp/manual/ja/macro/syntax/variables.html
http://ttssh2.sourceforge.jp/manual/ja/macro/command/strcompare.html
http://ttssh2.sourceforge.jp/manual/ja/macro/command/str2int.html


・recvln1つではエコーバックの分を受け取ってしまうようです。
他の出力を受信してしまう場合もあります。
確実にやるなら、目印を付けてwaitでそこまで待つ、というのがいい思います

sendln 'echo "=== EXIT STATUS === : $?"'
wait '=== EXIT STATUS === : '
recvln


・シェルスクリプトを入れることはできなくても、複合コマンドを実行することはできるはずです。
sendln '(sendmsg "test" && echo "==== OK ====") || echo "==== NG ===="'
waitlnで待ち→resultで分岐とできます
http://ttssh2.sourceforge.jp/manual/ja/macro/command/waitln.html
補足コメント
nan_dato_

お礼率 40% (2/5)

以下で試しましたが、bbbが存在しなく、echoの結果がNGとでたのに、Result1と表示されました。


sendln 'tail bbb && echo "==OK==" || echo "==NG=="'
waitln '==OK==' '==NG=='

if result = 0 then
messagebox inputstr "Result"
elseif result = 1 then
messagebox inputstr "Result1"
elseif result = 2 then
messagebox inputstr "Result2"
endif
投稿日時:2013/09/23 12:20
お礼コメント
nan_dato_

お礼率 40% (2/5)

頂いた内容を合わせて出来ました。ちゃんとResult2とでました。ありがとうございます!

sendln 'tail bbb && echo "==OK==" || echo "==NG=="'
wait '=='
recvln
recvln
waitln '==OK==' '==NG=='

if result = 0 then
messagebox inputstr "Result"
elseif result = 1 then
messagebox inputstr "Result1"
elseif result = 2 then
messagebox inputstr "Result2"
endif
投稿日時:2013/09/23 12:24

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 53% (2177/4070)

ちょいと試してみました。
# 接続先はCentOS 6.4のbashです。

----------------------------------------------------------
setsync 1
sendln 'echo $?'
recvln
recvln

if result = 1 then
messagebox inputstr "Result"
endif
----------------------------------------------------------
で、falseコマンド実行後は1が、trueコマンド実行後は0が表示されました。

動機モードになっていなかったため、recvlnを実行したときには受信処理が終わっていたのではないでしょうか?
補足コメント
nan_dato_

お礼率 40% (2/5)

条件分岐に0、1をそれぞれ入れて試しましたが、echo の結果が0なのに、if result = 0 thenではなく、if result = 1 thenの分岐に進みました。recvlnの結果がresultに格納されてません。
投稿日時:2013/09/23 12:03
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ