运行 使用 java 来自其自身根目录的 .sh 脚本

run a .sh script from its own root using java

我的 shell 脚本与我的 java 文件位于不同的目录中。此脚本仅包含 ls 打印当前目录中的文件。当我 运行 java 项目时,它打印 java 项目根目录中的文件,而不是 shell 脚本的根目录。我希望它打印 shell 脚本根目录中的文件。

Java代码:

ProcessBuilder pb = new ProcessBuilder("/home/omar/ros_ws/baxter3.sh");
Process p = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = null;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

使用ProcessBuilder.directory,你可能想要

String path = "/home/omar/ros_ws/baxter3.sh";
ProcessBuilder pb = new ProcessBuilder(path);
pb.directory(new File(path).getParent());

然后您应该将 ProcessBuilder 实例的工作目录设置为您要观看的目录。你可以做的就是使用它的方法directory(File directory)。 参见 Javadoc of ProcessBuilder

所以在 pb.start() 之前,为您的目录定义一个文件并将其分配给 ProcessBuilder 实例。

        File myDir = new File("/home/omar/ros_ws");
        pb.directory(myDir);
        pb.start();

一个简单的解决方案:命令 ls 可以是带有多个参数的 运行。其中之一是一个文件参数,它可以是一个目录。

来自ls man page

# List the contents of your home directory
$ ls ~

因此,只需将您的 shell 脚本传递到您在 java 代码中硬编码的目录:"/home/omar/ros_ws/" 并通过 [=] 在您的 shell 脚本中访问它16=].

因此您的 shell 脚本将类似于:

#!/bin/bash
ls 

然后从 java 通过以下方式调用您的 shell 脚本:

ProcessBuilder pb = new ProcessBuilder("/home/omar/ros_ws/baxter3.sh /home/omar/ros_ws/");
// other code omitted for brevity