使用expect与Java 9实用程序jshell

时间:2018-01-05 01:13:11

标签: java expect

Java 9附带了一个名为jshell的交互式read-eval-print实用程序。我想使用expect重定向其输入,以便我可以模拟录制的演示中的输入。但是虽然我可以从expect脚本中生成一个jshell进程,它也可以识别jshell提示符,之后没有任何效果。期望输出看起来像一个控制序列,比如" ^ [[24; 9R",我不会看到jshell的任何输出。不同的终端类型产生不同的字符序列,但它们都不起作用。这种行为在Ubuntu和Mac OS上的期望之间是一致的。有关如何调查此问题的任何建议都将受到欢迎。期待-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

然后期望超时,最后一行输出被shell提示覆盖(所以看起来好像在超时时会写入更多的控制字符)。

在脚本的第1行中添加-d到expect的标志会产生此输出:

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

0 个答案:

没有答案