我想从wsl
执行java
命令。
我正在尝试使用Process
和ProcessBuilder
。
据我了解,有两种方法可以做到这一点:
wsl
以及命令作为参数(例如:wsl ls -l
)(按命令执行此操作)。wsl
,然后逐个执行命令。但1
和2
存在一些问题。
点1
:
wsl ls
,我也无法确定何时可以调用下一个命令。wsl
不会在这些调用之间保存状态,因此不太方便 点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吗?即使c
或c++
lib也符合我的需求......
P.S。我试着找了好几天的解决方案。讲俄语的SO对我没有帮助,这就是我在这里的原因。对不起,我的英文......