【问题标题】:why is newline(\n) behaving differently then pressing enter on Raspbian CLI为什么换行(\n)的行为与在 Raspbian CLI 上按 Enter 不同
【发布时间】:2020-12-30 14:55:11
【问题描述】:

我制作了一个应用程序,它基本上可以读取数据并使用 system.out.print 在 raspbian 命令行界面 (CLI) 上打印出来。使用上述方法在 CLI 上打印文本适用于打印文本。

在打印文本后,我希望它的行为也像按 Enter 按钮(提交数据)。假设 CLI 提示您输入一个值,应用程序打印数据,然后我希望应用程序的行为就像用户按下 Enter 键一样。

该应用程序是一个守护进程,它在 CLI 中从外部设备打印数据。它可以并且确实在任何时候有意打印这些数据。不需要将数据发送到特定应用程序或一组应用程序,因为命令提示的应用程序可以每 x 时间交换一次。使用换行命令,光标会转到下一行,但它的行为不像用户要按下键盘的回车键。

我尝试使用 \n 将光标移动到下一行,但它没有提交数据。最后,我希望无需用户手动按下回车按钮就可以自动输入数据。

之后我尝试了 awt.robot 类,但这不起作用,因为它会引发无头异常,并且在谷歌搜索后我相信它与不会在 Raspbian 上安装和使用的 GUI 或功能有关。

我还发现有人提到 JNA 和 JNI 库,但我找不到任何示例(至少不适用于 linux 设备)来模拟用户的回车键。

这是一个更具体的例子。 CLI 提示:

Weight:

守护进程打印 0.233。所以 CLI 看起来像:

Weight: 0.233

那么应用程序必须表现得就像用户按下回车键一样。使用换行符只会移动光标,不会像用户按下回车按钮一样:

Weight: 0.233
_ (representing cursor).

最小/最简单的可重现示例:

public static void main(String[] args) {
  while(true) {
    //this moves the cursor to the next line and doesn't enter the line in a prompt.
    System.out.println("abc");
    //have to time that it goes into a prompt. I have a startup login prompt which I can test it with.
    //or whatever suits your needs
    Thread.sleep(20000);
  }
}

我用的是java 8,Raspbian版本是8,raspberry版本是3。

希望任何人都知道该做什么或我错过了什么。欢迎任何帮助。

【问题讨论】:

  • “在打印文本后,我希望它的行为也像按 Enter(提交数据)”提交给什么?您自己的应用程序的输入?另一个应用程序?你是如何做到这一点的?请edit您的问题提供更多详细信息。
  • 我编辑了这个问题,希望现在更清楚@FedericoklezCulloca。
  • @denbrau 不,不是,抱歉 :) 请明确回答我的问题。您希望自己的应用程序打印自己的输入吗?因为如果这是你想要做的,那没有任何意义。只需打印字符串,然后直接填充变量。如果您尝试填充另一个应用程序的输入,请查看 linux 中的输入/输出重定向(此时您的应用程序是用 java 编写的事实变得无关紧要)
  • 当您打印文本时,您所做的就是打印它。 linux shell 没有将该数据视为命令。您需要创建一个新进程来访问 shell。
  • 输出未输入。这就是它的全部。当您按下按键时,字符即为输入做好准备,同时也会显示出来。这并不意味着显示字符也会为输入做好准备。

标签: java terminal raspbian awtrobot system.out


【解决方案1】:

经过大量试验,我发现这正是 TTY 现在解释 /n 的方式。我有一个较旧的 Linux 安装,它将 /n 模拟为键盘按下,但在那个 raspbian 版本中不会发生这种情况。

所以基本上我必须像键盘一样直接写入正确的 IO 通道。您无法模拟键盘输入直接按下终端。只能通过直接写入正确的 IO 通道或使用键盘模拟器来实现。

【讨论】:

  • 是的,你可以。我已经编写了完全可以做到这一点的软件。您会发现查看How are \n and \r handled differently on Linux and Windows? 很有用。它会推动你朝着正确的方向前进。也不是/n,而是\n
  • 你用什么语言写的?在 java 中,我检查了多个版本以及 OpenJDK 和 Oracle 版本。例如,他们都需要一个非无头环境来进行键盘仿真。不是那篇文章没有帮助,它只是验证它在问题的特定场景中不起作用。
  • 在微控制器上的简化版 C++ 中。但现在我想起来了,我在做一些稍微不同的事情。微控制器接受来自它所连接的计算机的输入命令,并将其存储在内部(作为测量的设置数据),然后转换并回显到计算机。返回的数据由 Linux 上的screen 解释,这是一个终端多路复用器。所以仿真是在计算机本身上进行的。抱歉,我误读了您的问题。
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 2023-03-15
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2011-03-14
  • 1970-01-01
相关资源
最近更新 更多