【问题标题】:Executing shell commands using ProcessBuilder in linux在 Linux 中使用 ProcessBuilder 执行 shell 命令
【发布时间】:2017-05-27 17:44:59
【问题描述】:

我有一个代码,它接受一些 adb 命令并读取输入以稍后反映在 JTextField 中。它在 Windows 中运行良好,但在 linux 中,相同的代码给出了许多错误,例如 IOexception(没有这样的文件或目录)。在这种情况下我们是否必须指定操作系统特定的环境设置

ProcessBuilder process5 = new ProcessBuilder("adb", "shell","getprop","ro.product.model");   
Process p1 = process5.start();
InputStream stdin1 = p1.getInputStream();
BufferedReader writer1 = new BufferedReader(new InputStreamReader(stdin1));         
String model=writer1.readLine();

错误mgs-

Exception in thread "main" java.io.IOException: Cannot run program "adb": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at pb.main(pb.java:24)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 1 more

【问题讨论】:

  • adb 的目录在你的PATH 变量中吗?例如export PATH=...
  • 如果您粘贴确切的错误消息可能会有所帮助。但是,在您的 linux 系统上,可执行文件 adb 是否不在您的 PATH 中?如果是这样告诉我,那么我将此作为您接受的答案。要尝试,只需打开一个终端并尝试执行adb。如果不是,请将adb 的路径添加到您的路径中,或者在PATH 的某处创建指向adb 的符号链接,例如ln -s /path/to/adb /usr/local/bin/
  • @SubOptimal- 不。我必须手动执行此操作吗?
  • @Vampire- adb shell getprop ro.product.model - 此命令在终端中运行良好。亚行以其他方式运作
  • @vampire- 我认为路径没有像你说的那样设置。虽然 Adb 命令确实在我的终端上运行而没有设置任何内容。

标签: java linux shell processbuilder runtime.exec


【解决方案1】:

你能用绝对路径调用 adb 吗? 您可以使用whereis adb 找到绝对路径。 您还可以检查 JAVA process builder 中的 echo $PATH 返回的内容,以获得与 Java 程序相同的路径。

【讨论】: