gpt4 book ai didi

java - 如何向现有的 bash 进程发出多个命令?

转载 作者:行者123 更新时间:2023-12-01 17:52:32 26 4
gpt4 key购买 nike

我正在为 TUI Minecraft 服务器制作一个简单的 GUI 界面,我需要根据 GUI 事件(单击按钮等...)向该程序发出命令。我创建了一个进程构建器,但如何为正在运行的程序提供更多命令。

我想要完成的一个例子是用 Java 打开一个命令行程序,该程序询问我的名字。我的问题是,我如何为该程序命名。

我看过许多关于类似事情的现有 Stack-exchange* 帖子,但没有一个对我有用。

如果这很重要的话,我在linux上。

public Process runCommand(String command) throws IOException {
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", command, "-S");

Process process = pb.start(); // Executes the command
return process;
}

public void showCommandOutput(Process process) {
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

String line = ""; // Empty String to put the output in
try {
while ((line = reader.readLine()) != null) { // For every line in the shell output
System.out.println(line); // Print the line
}
try {
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace(); // If this goes wrong, display stack trace
} finally {
quitServer(0); // External function for closing program, self explanatory
}
} catch (IOException e) {
e.printStackTrace();
}
}

提前谢谢您。

最佳答案

你已经成功了一半。调用 pb.start() 时返回的 Process 对象包含与外部程序通信所需的输入和输出流。您已经在从 process.getInputStream() 中读取内容以获取流程的输出。要向其发送输入,您只需将数据写入 process.getOutputStream() 流即可。

在像 bash 这样的进程中使用 readLine() 时应该小心。当 bash 写出命令提示符时,它不会以换行符结束(因此您可以在同一行上输入命令)。因此,您的 readLine() 将永远等待不会到来的换行符。您可能想要使用无缓冲读取并检查数据中是否有任何看起来像提示的内容。

如果您确定您的程序将输出文本,期待响应,然后读取您的输入,则可以在现有循环中执行此操作。阅读检测到的每一行后提供命令是一个提示。例如:

    PrintStream commandWriter = new PrintStream(process.getOutputStream());
while ((line = reader.read()) != null) { // For every line in the shell output
// if I know prompts end with a certain substring
if (line.endsWith("$> ")) {
commandWriter.println("echo \"this is a command I sent to a process\"");
}
else {
System.out.println("Received from process: " + line);
}
}

但是,如果您正在交互的程序更具交互性,您可能需要启动单独的线程来读取和写入输入/输出。您必须小心处理这些流程,以确保在数据可用时继续从中读取数据。如果您忘记这样做,外部程序可能会在缓冲区已满时卡住而挂起。

关于java - 如何向现有的 bash 进程发出多个命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60771031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com