我试图从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
命令工作一次,但当我尝试[
IntentFilter
(
new[] { Intent.ActionView },
Categories = new[]
{
Intent.CategoryDefault,
Intent.CategoryBrowsable
},
DataSchemes = new[] { "http", "https" },
DataHosts = new[] { "*.xamarin.com", "xamarin.com" },
DataMimeType = "text/plain"
)
]
时,Java再次停止。
有什么方法可以让这个工作吗?我想要的是从Java程序启动一个正常的交互式bash提示。
答案 0 :(得分:0)
似乎ProcessBuilder
方法inheritIO
做了我想做的事。
ProcessBuilder b = new ProcessBuilder(args);
b.inheritIO();
Process p = b.start();