【问题标题】:run a .sh script from its own root using java使用 java 从自己的根目录运行 .sh 脚本
【发布时间】:2016-04-18 08:08:08
【问题描述】:

我在与我的 java 文件不同的目录中有一个 shell 脚本。这个脚本只包含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);
}

【问题讨论】:

    标签: java bash shell processbuilder


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      使用ProcessBuilder.directory,你可能想要

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

      【讨论】:

      • 谢谢哥们。这行得通,我刚刚将第 3 行替换为: pb.directory(new File(path).getParentFile());
      【解决方案3】:

      一个简单的解决方案:命令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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        • 2011-08-29
        • 2013-11-01
        • 1970-01-01
        相关资源
        最近更新 更多