从Java运行bash文件不起作用

从Java运行bash文件不起作用,java,bash,shell,ubuntu,Java,Bash,Shell,Ubuntu,通过这段代码,我试图启动一个简单的bash文件,该文件位于程序的目录中。bash文件的代码在我用shell启动它或简单地执行它时工作。bash文件的代码可以正常工作 我尝试了所有的选择,但都不起作用。我已经评论了每种情况下发生的情况。我不明白它找不到该文件,因为bash文件位于同一目录中。您没有看到输出,原因有两个: 您不必等待流程完成 您不会将它的输出重定向到Java进程运行的同一控制台 而且,您可能需要使用像/bin/bash-cpath/to/your/file.sh这样的命令。请注意-c

通过这段代码,我试图启动一个简单的bash文件,该文件位于程序的目录中。bash文件的代码在我用shell启动它或简单地执行它时工作。bash文件的代码可以正常工作


我尝试了所有的选择,但都不起作用。我已经评论了每种情况下发生的情况。我不明白它找不到该文件,因为bash文件位于同一目录中。

您没有看到输出,原因有两个:

您不必等待流程完成 您不会将它的输出重定向到Java进程运行的同一控制台 而且,您可能需要使用像/bin/bash-cpath/to/your/file.sh这样的命令。请注意-c标志

IMHO,在Java中设计和执行外部进程的最佳方法是

假设您的sh文件位于resources目录中的某个位置,下面是一个示例主类:

try{

        //String[] cmd = new String[]{"/bin/sh", "send.sh"};
        //Process pr = Runtime.getRuntime().exec(cmd);  //nothing happens           
        //Process p = Runtime.getRuntime().exec("send.sh"); //File not found
        //Process p = Runtime.getRuntime().exec("bash send.sh"); //nothing happens

        // ProcessBuilder pb = new ProcessBuilder("bash","send.sh");
        // Process p = pb.start(); //nothing happens

    }
    catch(Throwable t)
    {
        t.printStackTrace();
    }
注意,我使用方法重定向进程的流。Redirect.INHERIT将流重定向到JVM实例的相应流。它适用于输入和输出流。最后,我在等待一个过程用方法完成。事实上,您可以做更多的事情,比如将输出捕获到字符串中、从字符串提供输入或异步运行流程,但这只是一个简单的示例

如果将sh文件存储在其他位置,则必须更新路径相关逻辑

看看完整的示例。这是一个Gradle项目,您可以使用./gradlew run来执行它:

public class App {
    public static void main(String[] args) throws Exception {
        final ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", App.class.getResource("/46964369.sh").getPath());

        processBuilder.redirectInput(Redirect.INHERIT);
        processBuilder.redirectOutput(Redirect.INHERIT);
        processBuilder.redirectError(Redirect.INHERIT);

        processBuilder.start().waitFor();
    }
}

由于两个原因,您看不到输出:

您不必等待流程完成 您不会将它的输出重定向到Java进程运行的同一控制台 而且,您可能需要使用像/bin/bash-cpath/to/your/file.sh这样的命令。请注意-c标志

IMHO,在Java中设计和执行外部进程的最佳方法是

假设您的sh文件位于resources目录中的某个位置,下面是一个示例主类:

try{

        //String[] cmd = new String[]{"/bin/sh", "send.sh"};
        //Process pr = Runtime.getRuntime().exec(cmd);  //nothing happens           
        //Process p = Runtime.getRuntime().exec("send.sh"); //File not found
        //Process p = Runtime.getRuntime().exec("bash send.sh"); //nothing happens

        // ProcessBuilder pb = new ProcessBuilder("bash","send.sh");
        // Process p = pb.start(); //nothing happens

    }
    catch(Throwable t)
    {
        t.printStackTrace();
    }
注意,我使用方法重定向进程的流。Redirect.INHERIT将流重定向到JVM实例的相应流。它适用于输入和输出流。最后,我在等待一个过程用方法完成。事实上,您可以做更多的事情,比如将输出捕获到字符串中、从字符串提供输入或异步运行流程,但这只是一个简单的示例

如果将sh文件存储在其他位置,则必须更新路径相关逻辑

看看完整的示例。这是一个Gradle项目,您可以使用./gradlew run来执行它:

public class App {
    public static void main(String[] args) throws Exception {
        final ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", App.class.getResource("/46964369.sh").getPath());

        processBuilder.redirectInput(Redirect.INHERIT);
        processBuilder.redirectOutput(Redirect.INHERIT);
        processBuilder.redirectError(Redirect.INHERIT);

        processBuilder.start().waitFor();
    }
}


什么都不发生意味着什么?您希望bash脚本的输出打印到标准输出吗?如果是这样的话,如果没有更多的代码,那就不会发生。还有一些空间可以进行更多的实验。一个例子是启动一个交互式shell,而不是立即运行脚本,另一个例子是提供脚本的完整路径。此外,首先,您可能希望在该脚本中有一些可以确保正常工作的内容,例如将某些内容回显到文件中,就像/tmp/my.test一样,你的代码不起作用,因为它都被注释掉了。@Andreas,lol。是的,这确实是个问题。什么都没有发生意味着什么?您希望bash脚本的输出打印到标准输出吗?如果是这样的话,如果没有更多的代码,那就不会发生。还有一些空间可以进行更多的实验。一个例子是启动一个交互式shell,而不是立即运行脚本,另一个例子是提供脚本的完整路径。此外,首先,您可能希望在该脚本中有一些可以确保正常工作的内容,例如将某些内容回显到文件中,比如/tmp/my.test你的代码不起作用了,因为它都被注释掉了。@Andreas,lol。是的,这确实是个问题。我回家后会试试的。sh文件位于程序的目录中。我想你的代码会有用的,非常感谢。我会报告它是否有效。是的,您也可以为进程指定一个工作目录,这样它就知道在哪里解析文件。sry,这花了这么长时间。好吧,我试过这个例子。我用我的文件替换了您示例中的文件。但现在它只是说该文件不存在!它不是隐藏的,我给了它完全的访问权限。可能是什么?/bin/bash:/home/pi/Documents/Java/BlueJ%20Projects/Trashprojects/shell/send.sh:找不到文件或路径。从日耳曼语翻译过来,忘了提到:我正在和ubuntuI一起制作覆盆子圆周率,我回家后会试试。sh文件位于程序的目录中。我想你的代码会有用的,非常感谢。我会报告它是否有效。是的,您也可以为进程指定一个工作目录,这样它就知道在哪里解析文件。sry,这花了这么长时间。好吧,我试过这个例子。我用我的文件替换了您示例中的文件。但现在它只是说该文件不存在!它不是隐藏的,我给了它完全的访问权限。它能做什么
be?/bin/bash:/home/pi/Documents/Java/BlueJ%20Projects/Trashprojects/shell/send.sh:找不到文件或路径。从日耳曼语翻译过来,我忘了提到:我正在用ubuntu开发一个树莓圆周率