2

記録されたデモで入力をシミュレートできるように、expect を使用して jshell 入力をリダイレクトしたいと思います。しかし、jshell プロンプトも認識できる expect スクリプトから jshell プロセスを生成することはできますが、その後は何も機能しません。のような制御シーケンスのように見える出力を期待し^[[24;9R、jshell からの出力は表示されません。異なる端末タイプは異なる文字シーケンスを生成しますが、どれも機能しません。この動作は、Ubuntu と Mac OS での期待の間で一貫しています。この問題を調査する方法についての提案は大歓迎です。expect -d役に立ちません。

これは、シミュレートしたいjshellセッションのトランスクリプトです

$ jshell
|  Welcome to JShell -- Version 9.0.1
|  For an introduction type: /help intro

jshell> 3
$1 ==> 3

jshell> 

そして、これが私がそれを行うべきだと思うスクリプトです:

#!/usr/bin/expect -f
spawn jshell
expect jshell>
send "3\r"
expect jshell>

そのスクリプトを実行すると (Mac OS 10.11.6 では、Ubuntu でも非常によく似た結果が得られます)、次の出力が表示されます。

spawn jshell
|  Welcome to JShell -- Version 9.0.1
|  For an introduction type: /help intro

jshell> ^[[24;9R

その後、期待どおりのタイムアウトが発生し、出力の最後の行がシェル プロンプトによって上書きされます (そのため、タイムアウト時にさらに制御文字が書き込まれているように見えます)。

スクリプトの 1 行目で expect のフラグを追加-dすると、次の出力が得られます。

expect version 5.45
argv[0] = /usr/bin/expect  argv[1] = -d  argv[2] = -f  argv[3] = ./expectscript
set argc 0
set argv0 "./expectscript"
set argv ""
executing commands from command file ./expectscript
spawn jshell
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {19712}

expect: does "" (spawn_id exp8) match glob pattern "jshell>"? no
|  Welcome to JShell -- Version 9.0.1
|  For an introduction type: /help intro

expect: does "|  Welcome to JShell -- Version 9.0.1\r\n|  For an introduction type: /help intro\r\n" (spawn_id exp8) match glob pattern "jshell>"? no

jshell>
expect: does "|  Welcome to JShell -- Version 9.0.1\r\n|  For an introduction type: /help intro\r\n\r\njshell> " (spawn_id exp8) match glob pattern "jshell>"? yes 
expect: set expect_out(0,string) "|  Welcome to JShell -- Version 9.0.1\r\n|  For an introduction type: /help intro\r\n\r\njshell> "
expect: set expect_out(spawn_id) "exp8"
expect: set expect_out(buffer) "|  Welcome to JShell -- Version 9.0.1\r\n|  For an introduction type: /help intro\r\n\r\njshell> "
send: sending "3\r" to { exp8 }

expect: does "" (spawn_id exp8) match glob pattern "jshell>"? no

expect: does "\u001b[6n" (spawn_id exp8) match glob pattern "jshell>"? no
^[[32;1Rexpect: timed out
4

1 に答える 1