如何从java顺序执行wsl命令?

时间:2018-04-30 21:54:16

标签: java bash windows-subsystem-for-linux

我想从wsl执行java命令。

我正在尝试使用ProcessProcessBuilder

据我了解,有两种方法可以做到这一点:

  1. 运行wsl以及命令作为参数(例如:wsl ls -l)(按命令执行此操作)。
  2. 运行wsl,然后逐个执行命令。
  3. 12存在一些问题。

    1

    1. 当命令终止时,进程不会停止。所以即使我运行wsl ls,我也无法确定何时可以调用下一个命令。
    2. wsl不会在这些调用之间保存状态,因此不太方便
    3. 2

      由于wsl未显示bash prompt,因此我无法跟踪命令何时停止显示信息。例如:

      ProcessBuilder pb = new ProcessBuilder("wsl");
      pb.redirectErrorStream(true);
      Process p = pb.start();
      Thread.sleep(1000);
      OutputStreamWriter osw = new OutputStreamWriter(p.getOutputStream());
      osw.write("ls\n");
      osw.flush();
      

      我只能读到:

      build.gradle
      gradle
      gradlew
      gradlew.bat
      out
      settings.gradle
      src 
      

      没有selya@selya-pc:/mnt/c/Users/selya$阅读。所以我不能将它用作命令之间的分隔符。我认为wsl以某种方式跟踪它在启动的环境中,例如,通过isatty(),因此输出是不同的。

      同时使用:

      据我所知,对于在终端外运行的程​​序,stdout没有缓冲。因此,例如sudo存在一些问题,因为它在没有newline / flush[sudo] password for selya:)的情况下要求输入密码,因此我无法读取此行......

      我找到了一个解决方案 - 传递命令作为unbuffer util的参数,例如:

      wsl unbuffer -p sudo apt-get update 
      

      -p代表pipeline)。

      但其他问题仍然存在。有没有办法做到这一点?或者也许有lib吗?即使cc++ lib也符合我的需求......

      P.S。我试着找了好几天的解决方案。讲俄语的SO对我没有帮助,这就是我在这里的原因。对不起,我的英文......

1 个答案:

答案 0 :(得分:0)

问题在pty4j的帮助下得到了解决。它适用于linux,mac和windows。 (它的工作方式类似于Linux上的伪终端,但有很好的java接口)。