コマンド実行後に何も表示されないことを判断する方法

回答済み

コメント

2件のコメント

  • 正式なコメント
    Ichiro Takahashi

    フィックスポイントの高橋です。

    セッションブロック内において、以下のイベントジョブでプロンプトを待ち受けされています。

    <s ?? g'$prompt'>

    これは、セッションで得られた出力を先頭から見ていきプロンプトに合致するものがあれば、それ以前の出力を破棄して合致した値を返す動きとなります。よって、step3-2 で "echo test" による出力があるにも関わらず、それを捨てて、その後に表示されたプロンプトを拾って、上記のイベントジョブの結果となります。(むしろ「step3-3は、想定通りに異常終了します」のほうが、何かおかしいような気がしますが、いただいた結果だけでは判断がつきません。手元環境では step3-3 も正常になります)

    プロンプトまでの出力を保存しておき判断する、という方法が有効かもしれません。たとえば、コマンドを送信している部分から while $RESULT で出力を待ち受けているループの部分を、以下のようにしてみてはいかがでしょうか。

            [results = []] ->
            [s.send:command[2] + '\n'] -> # コマンドを実行
           { while true |
                <s: timeout> =>
                {if $STATUS |
                    break  # タイムアウトしたらループを抜ける
                } ->
    [results.add_item: $RESULT] ->
                { if $RESULT =~ g'$prompt' |
                    break  #プロンプトを見つけたらループを抜ける
              }
          } ->

    セッションの待ち受けがタイムアウトした場合はループを抜けます。出力をえられた場合は配列 results に追加していき、それがプロンプトにマッチする場合はループを抜けます。

    このようにすると、コマンドによる出力とマッチしたプロンプトが配列 results に格納されるはずです。

    出力がプロンプトだけであるかは、簡単には以下のように配列 results の要素数で判定できるかもしれません。

            {if length(results) == 1 |
    :
    print(results)

    ただし、このジョブフローでは __ust_pty__ = true としていて、PTY モードでサーバにアクセスしています。このときは送信したコマンドのエコーバック表示もセッションで受信することになるので、コマンドが何も出力しなくても、results には送信したコマンド行とプロンプト行の2要素が格納されているかもしれません(手元ではそのようになりました)。

    この方式を持ちいる場合は、コマンドのエコーバックとプロンプトの扱いについては工夫が必要になるかもしれません。

    よろしければ、上記参考にしていただいて、よりテストしたい内容になるようにジョブフローを調整してみてください。

    コメントアクション パーマリンク
  • ide

    フィックスポイント 高橋様

    ご回答いただき、ありがとうございます。

    記載していただいた、resultsの要素数で判定する方法を使用して
    期待していた結果が得られました。
    私の環境でもresults には送信したコマンド行とプロンプト行の2要素が格納されました。

    この問題をなかなか解消できずに悩んでいたので、とても助かりました。
    心より感謝申し上げます。

    0
    コメントアクション パーマリンク

サインインしてコメントを残してください。