簡體   English   中英

為什么不能在Java中使用ProcessBuilder啟動`bash -i`?

[英]Why can't I start `bash -i` using ProcessBuilder in Java?

我正在嘗試從Java應用程序運行命令bash -i ,因為我希望用戶能夠在某些工作中使用外殼程序,然后返回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進程停止,外殼是sh再次,我想。 寫完fgdate命令可以工作一次,但是當我嘗試pwd時,Java再次停止了。

有什么辦法可以使它正常工作嗎? 我想要的是從Java程序啟動正常的交互式bash提示。

看來ProcessBuilder方法inheritIO我的要求。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM