gpt4 book ai didi

java - 为什么我不能在 Java 中使用 ProcessBuilder 启动 `bash -i`?

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:28 25 4
gpt4 key购买 nike

我正在尝试从 Java 应用程序运行命令 bash -i,因为我希望用户能够在某些工作中使用 shell,然后返回到 Java 应用程序。

我有这个测试代码:

import java.io.*;
public class exec {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder b = new ProcessBuilder(args);
b.redirectError(ProcessBuilder.Redirect.INHERIT);
Process p = b.start();
InputStream pout = p.getInputStream();
PrintWriter pin = new PrintWriter(p.getOutputStream());
Thread in = new Thread(() -> {
while (true) {
try {
int i = System.in.read();
if (i == -1) break;
pin.write(i);
pin.flush();
} catch (IOException e) {
e.printStackTrace();
break;
}
}
System.err.println("in finished");
});
Thread out = new Thread(() -> {
while (true) {
try {
int i = pout.read();
if (i == -1) break;
System.out.write(i);
} catch (IOException e) {
e.printStackTrace();
break;
}
}
System.err.println("out finished");
});
out.start();
in.start();
p.waitFor();
}
}

编译后一切正常。我什至可以启动 bash shell:

$ java exec date
ti 21.3.2017 19.03.25 +0200
out finished
^C$ java exec bash
date
ti 21.3.2017 19.03.30 +0200
^Cout finished

但是,当我尝试启动 bash -i shell 时,终端开始表现异常。

$ java exec bash -i
[1] + Stopped (tty input) java exec bash -i
$ user@computer:/tmp$ fg
java exec bash -i
date
date
ti 21.3.2017 19.05.21 +0200
user@computer:/tmp$ pwd
pwd
[1] + Stopped (tty input) java exec bash -i

Java 进程停止了,shell 又是sh,我想。在编写完 fg 后,date 命令工作了一次,但是当我尝试 pwd 时 Java 再次停止。

有什么方法可以让它正常工作吗?我想要的是从 Java 程序启动一个正常的交互式 bash 提示符。

最佳答案

看起来 ProcessBuilder 方法 inheritIO 做了我想要的。

ProcessBuilder b = new ProcessBuilder(args);
b.inheritIO();
Process p = b.start();

关于java - 为什么我不能在 Java 中使用 ProcessBuilder 启动 `bash -i`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42933879/

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