使用java从自己的root运行.sh脚本

时间:2016-04-18 08:08:08

标签: java bash shell processbuilder

我的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);
}

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

使用您可能需要的ProcessBuilder.directory

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

答案 2 :(得分:0)

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

来自ls man page

# List the contents of your home directory
$ ls ~

因此,只需将您在Java代码中硬编码的目录传递给shell脚本:"/home/omar/ros_ws/"并通过$1在shell脚本中访问它。

所以你的shell脚本看起来像:

#!/bin/bash
ls $1

通过以下方式从java调用shell脚本:

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