アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 …参照
----------------------------------------------------------
sendln 'echo $?'
recvln
recvln

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

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

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

A 回答 (2件)

ちょいと試してみました。


# 接続先はCentOS 6.4のbashです。

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

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

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

この回答への補足

条件分岐に0、1をそれぞれ入れて試しましたが、echo の結果が0なのに、if result = 0 thenではなく、if result = 1 thenの分岐に進みました。recvlnの結果がresultに格納されてません。

補足日時:2013/09/23 12:03
    • good
    • 1

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



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


・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/com …

この回答への補足

以下で試しましたが、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
    • good
    • 3
この回答へのお礼

頂いた内容を合わせて出来ました。ちゃんと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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A