【问题标题】:run a .sh file using java使用 java 运行 .sh 文件
【发布时间】:2016-08-08 17:54:33
【问题描述】:

我想使用 java 运行一个 .sh 文件。我想打开一个终端,然后我可以在同一个终端中执行另一个命令并最终销毁它。 我已经使用过 ProcessBuilder 但我无法做到这一点。 我的一段代码:

ProcessBuilder pb = new ProcessBuilder("/home/omar/ros_ws/baxter2.sh");
Process p = pb.start();

这个方法曾经在另一个代码中工作过,但我不知道为什么它在我的代码中不起作用。

提前致谢

【问题讨论】:

  • 是的,我在 java 中没有错误。它只是没有效果。一旦我运行代码,它就会正常结束而不执行 .sh 文件。我没有看到终端

标签: java bash terminal command


【解决方案1】:

你怎么知道它没有执行?也许你只是没有看到它的结果。在控制台中执行并打印后,您应该会得到p.getInputStream(),例如:

BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null)
{
   System.out.println(line);
}

另外,如果您使用的是 jdk 7+,请尝试:

pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();

【讨论】:

  • 这已经打印了输出。我想到了一些东西。我制作了一个只包含 pwd 的脚本,它打印当前目录,输出是“/home/omar/workspace/script runner”,它是 eclipse 工作区的目录,而不是根目录。我该如何解决这个问题。
  • 你的意思是之前的问题解决了?我不确定我是否理解您的解释,但这似乎是另一个问题,可能需要发布另一个问题......
【解决方案2】:

我认为您应该使用以下命令将 .sh 文件授予用于运行 java 程序的操作系统用户的可执行权限。

chmod u+x baxter2.sh

【讨论】:

    【解决方案3】:

    您的程序是否输出错误,或者您的程序没有与文件交互?

    我建议尝试 ProcessBuilder 中的目录方法。

    Process p = null;
    ProcessBuilder pb = new ProcessBuilder("baxter2.sh");
    pb.directory("/home/omar/ros_ws");
    p = pb.start();
    

    如果这不起作用,您还应该查看您尝试访问的文件的用户权限。

    【讨论】:

    • 同样的事情。没有错误,也没有权限问题。
    • 重点是,当我将路径更改为不存在的 .sh 文件时,它会抛出 IOException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2017-11-06
    • 1970-01-01
    • 2013-03-03
    • 2015-07-03
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多