我可以在 Unix 中运行 jshell 吗?

2023-12-09

我想使用expect重定向jshell输入,以便我可以在录制的演示中模拟输入。但是,尽管我可以从 Expect 脚本生成一个 jshell 进程,该进程也可以识别 jshell 提示符,但之后就没有任何效果了。期望输出看起来像控制序列,例如^[[24;9R,并且我没有看到 jshell 的任何输出。不同的终端类型会产生不同的字符序列,但它们都不起作用。此行为在 Ubuntu 和 Mac OS 上的 Expect 之间是一致的。欢迎任何有关如何调查此问题的建议。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

然后expect超时,并且最后一行输出被shell提示符覆盖(因此看起来好像在超时时正在写入更多控制字符)。

Adding -d脚本第 1 行中的 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

设法让它工作(在 Debian 9.3 上使用 jshell 9.0 和 Expect 5.45 进行测试):

[STEP 103] # cat jshell.exp
proc expect_prompt {} {
    upvar spawn_id spawn_id

    expect -ex "jshell> "

    # the CPR (cursor position report) code
    expect -ex "\x1b\[6n"

    # read the CPR result and send it the application
    expect_tty -re {\x1b\[[0-9]+;[0-9]+R}
    send $expect_out(0,string)
}

stty raw; # give tty's full control to jshell since it's crazy

spawn jshell
expect_prompt

send "3\r"
expect_prompt

send "/exit\n"
expect eof
[STEP 104] # expect jshell.exp
spawn jshell
|  Welcome to JShell -- Version 9.0.1
|  For an introduction type: /help intro

jshell> 3
$1 ==> 3

jshell> /exit
|  Goodbye
[STEP 105] #

魔法是关于CPR(光标位置报告)(搜索CPR在页面上)。

  1. The ^[[6n (^[ == ESC == 0x1b == \u001b) is the CPR request (sent by jshell).
  2. 字符串像^[[32;1R(第 32 行,第 1 列)是当前光标位置(由终端驱动程序生成并由jshell).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 Unix 中运行 jshell 吗? 的相关文章

  • 向伪 shell (pty) 发出命令

    我尝试使用 subprocess popen os spawn 来运行进程 但似乎需要伪终端 import pty master slave pty openpty os write master ls l 应该发送 ls l 到从属终端
  • 如何在 {expect} 脚本中创建“循环”语句?

    假设是 这是脚本 usr bin expect set a test 我想在这个脚本中创建一个循环 以便它可以打印值 a 前面有一个基于循环的数字 所以如果我想让它循环3次 最终产品将变成 1 test 2 test 3 test 您可以使
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 如何在 Visual Studio Code 中从集成终端引用当前文件

    我想知道是否可以 使用内置变量 直接使用集成终端在 Visual Studio 中打开的当前文件 例如 gt some command current file Where current file would be a built in
  • 如何将环境变量 PACKAGE_DIRS 链接到我的本地私有包?

    我正在尝试设置一个环境变量 以便当我正在处理 Meteor 应用程序时 并且我想将本地私有包链接到我的项目 Meteor 将查找我在本地环境中创建的包目录 我做的第一件事是创建一个包目录并向其中添加一个基本的测试包 Users scotty
  • Alt 键快捷键在使用 Vim 的 gnome 终端上不起作用

    我在 gnome 终端上运行 Vim 但 alt 键映射不起作用 例如 imap
  • 如何在 bash 上运行 MySQL 命令?

    以下代码在命令行上运行 mysql user myusername password mypassword database mydatabase execute DROP DATABASE myusername CREATE DATABA
  • linux命令中括号的用途是什么[重复]

    这个问题在这里已经有答案了 我在 Linux 终端中运行以下命令 谁能告诉我 Linux 终端中括号和以下命令的用途是什么 echo GET HTTP 1 0 echo 主机 www google com echo 数控 www googl
  • 如何从终端启动 applescript.scpt 文件并传递术语/变量?

    我有一个苹果脚本 它可以执行以下操作 using terms from application Quicksilver on open theseitems repeat with aitem in theseitems display d
  • 如何在 TCL/EXPECT 中使用 $expect_out 分配变量?

    如果我想匹配DEF 23使用以下正则表达式 expect re DEF 0 9 set result expect out 1 string 为什么它说no such element in array 如何 expect out工作 以及我
  • 如何在 osx 终端中返回应用程序版本

    我需要在 Mac osX 10 10 上的 sh 脚本中使用应用程序版本 以便我可以与另一个数字进行比较 以便我可以强制更新或不更新 到目前为止我已经有了这个 我使用 Firefox app 作为示例 FirefoxmdlsVersion
  • 为什么我无法在 Mac OS X Terminal.app 上的 Python 解释器中显示 unicode 字符?

    如果我尝试粘贴 unicode 字符 例如中间的点 在我的 python 解释器中它什么也不做 我在 Mac OS X 上使用 Terminal app 当我只是在 bash 中时 我没有遇到任何问题 但在解释器中 python Pytho
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 为 CocoaPods 插件设置 Xcode

    我正在尝试设置终端 Xcode 以便正确工作Xcode CocoaPods 插件 https github com kattrali cocoapods xcode plugin 当我从插件运行集成 cocoapods 选项时 我收到一条消
  • 如何在 VS code 上安装 Windows 终端

    一切尽在标题 我也是俄罗斯人 这是谷歌翻译 我在任务管理器中打开该进程并转到文件位置 出现拒绝访问错误 但在计算机控制的帮助下已解决 但我不知道如何在 VS Code 中打开这个特定的终端 我首先介绍了OpenConsole 是的 但它只是
  • 如何将您的终端与 Android 模拟器连接

    我尝试导航到 android 工具文件夹并输入 adb shell 命令 但它似乎不起作用 我的终端似乎只能识别命令的 adb 部分 并给我一条错误消息 我究竟做错了什么 通过键入列出所有连接的设备adb devices 检查是否列出了任何
  • 串口读取未完成

    下面的函数用于在Linux下从串口读取数据 我在调试时可以读取完整的数据 但是当我启动程序时 读缓冲区似乎并不完整 我正确接收了一小部分数据 但缓冲区的其余部分完全正确zero 可能是什么问题呢 int8 t serial port ope
  • 如何通过双击使该 file.sh 可执行?

    首先我用的是Mac 接下来 我需要执行这个 file sh 我们将调用它 每次我需要执行它时 我都必须打开终端并输入 cd Users Jacob Documents folderWithFileInIt bash file sh 这没关系
  • 在 MacOS 上重新启动终端而不关闭

    如何在不关闭窗口的情况下重新启动当前的 MacOS 终端会话 在Linux中我使用exec bash但在这种环境下它不起作用 我对 bash profile 提示 别名等 我想在不关闭它并再次打开的情况下查看 只需输入命令 exec bas
  • 由于 Xcodebuild,终端在每个命令上都停止运行

    我刚刚将 Xcode 更新到 11 4 突然间我的终端 iTerm 3 3 9 变得非常慢 键入命令效果很好 但在按下 Enter 后 我经常等待 3 4 秒才能执行一个简单的任务 cd git add etc 当我查看状态栏时 我注意到x

随机推荐

  • 如何解决React Hook关闭问题?

    import React useState from react import ReactDOM from react dom function App const count setCount useState 0 function ha
  • 如果在条件中,“set -e”不会导致代码块退出

    我试图找出错误保释行为的原因 e如果失败的块位于条件链中 则不会启动 bin bash set e echo First ls blat echo this should not print 打印出 First ls cannot acce
  • Android Play 控制台:内部测试版本,密切测试?它是如何运作的?

    我已经在 Play 商店上有一个生产应用程序 现在我已经在内部测试轨道上上传了下一个发行版本 我已经与团队测试人员创建了一个邮件列表 但现在我团队的所有测试人员都看到了测试版本 并且他们无法在生产版本和测试版本之间进行选择 有没有办法在两个
  • 使用 Java 注解 - 生成代码

    我正在使用 java 6 注释处理 api 我遵循以下优秀教程来创建在构建时显示消息的注释处理器 http kerebus com 2011 02 using java 6 processors in eclipse 然而 就我而言 我有一
  • 超时 WCF 服务

    WCF 中的超时是如何工作的 例如我知道你可以配置发送超时 and 接收超时用于客户端绑定 但它们是如何工作的呢 MSDN 描述发送超时 as TimeSpan 值 指定为某个事件提供的时间间隔 发送操作完成 该值应该大于或等于 到零 默认
  • 后台服务启动两次

    我有以下后台服务 public class MyHostedService BackgroundService private readonly ITaskQueue taskQueue private readonly ILifetime
  • AES 加密和解密

    我用 swift 编写了一个应用程序 我需要 AES 加密和解密功能 我从另一个 Net 解决方案收到了加密数据 但我找不到可以执行此操作的方法 这是我的 net 加密 public static byte AES Encrypt byte
  • 使用 Eclipse 的 java 定时器

    我正在尝试使用 Eclipse 用 Ja va 编写一个小程序 但我有点迷失了 有人可以向我解释一下 以 傻瓜式的方式 我需要做什么才能使用计时器重新绘制表单吗 我正在尝试做一些像时钟一样简单的事情 我需要一个计时器每秒重新绘制它 像这样的
  • 有人可以帮我清理这个吗? (初学者,SQL)[重复]

    这个问题在这里已经有答案了 我正在 hackerrank com 上做练习 SQL 初学者练习 我相信你们很多人都熟悉它 这是问题 从 STATION 查询不以元音开头且不以元音结尾的 CITY 名称列表 您的结果不能包含重复项 我的回答如
  • 将信息发送到上下文菜单的内容脚本

    我见过很多有关上下文菜单和双向通信的问题 看来我知道我的问题的答案 你不能 但无论如何我都会尝试 每个页面上都有一个由 page mod 创建的模态 div 该模式旨在当用户将鼠标悬停在文本节点中的单词上以提供单词的翻译时显示 这工作得很好
  • UILocalNotification 重复

    我想在每周日和周一重复 我怎样才能实现这个目标 尝试设置 2 个通知 其中一个是周日fireDate另一个是星期一fireDate并将两个重复间隔设置为NSWeekCalendarUnit
  • 通过所有必需点到达终点

    给定一个宽度为 W 高度为 H 的网格 其中包含 5 种类型的符号 S means starting position E means ending position C means checkpoints means open posit
  • Maven 不下载代理后面的 jar

    Maven 无法下载代理后面的 jar 依赖项 这是我的 pom xml
  • Hbase 类NotFoundException

    我想运行一个地图缩减示例 package my test import java io IOException import java util HashMap import java util Map import java util M
  • 调试 SignalR 挂起

    Windows 7 SignalR2 我有一些 HelloWorld SignalR 代码 可以在一个 VS2013 项目 即我的 SignalR hello world Playground 中运行 当我将相同的代码添加到现有应用程序时
  • Joomla v1.5 插件 sys.ini 语言文件

    Joomla v1 5 插件可以使用 sys ini 语言文件吗 我想在插件安装期间使用它 因为在安装过程中无法访问默认语言 ini 文件 因此 安装管理器仅输出语言关键常量 例如 PLG MY PLUGIN DESCRIPTION 我在
  • Watson 对话意图和实体是否支持正则表达式?

    我正在使用我公司想要创建的可能对话来测试 Watson Conversation API 我们正在使用巴西葡萄牙语进行开发 鉴于葡萄牙语是一种丰富的语言 有时用户可能会犯错误 我们希望预测这些可能的错误 主要是特殊字符和重音符号 例如 单词
  • 我可以创建一个带有弧形底部的 div 吗?

    所以我正在开发一个网站 我想知道是否可以纯粹使用 HTML5 CSS3 如果需要的话还可以使用 JavaScript 制作一个底部弯曲的 div 所以它实际上看起来像这样 或者只能使用背景图像来完成 div class navbar nav
  • 如何在用户输入的输入类型=文本中附加%符号?

    我正在使用数字微调器 并且默认情况下我希望输入在文本框中包含 符号 我尝试使用跨度 但它在框外添加了符号 您可以使用一个简单的 css 技巧来实现这一点 只需将其添加到您的代码中即可 spinner input padding right
  • 我可以在 Unix 中运行 jshell 吗?

    我想使用expect重定向jshell输入 以便我可以在录制的演示中模拟输入 但是 尽管我可以从 Expect 脚本生成一个 jshell 进程 该进程也可以识别 jshell 提示符 但之后就没有任何效果了 期望输出看起来像控制序列 例如