【问题标题】:Cannot launch shell script with arguments using Java ProcessBuilder无法使用 Java ProcessBuilder 启动带参数的 shell 脚本
【发布时间】:2013-08-16 22:47:02
【问题描述】:

我正在尝试使用 ProcessBuilder 执行带有命令行参数的 shell 脚本,这个 shell 脚本又调用了另外两个使用这个参数的 shell 脚本。第一个 shell 脚本运行良好,但是当第二个脚本启动时,它返回退出代码 1。

来自 Java 程序的 ProcessBuilder sn-p:

//scenario - A string that holds a numerical value like 1 or 2 etc
String[] command2 = {"/bin/bash", "<path to shell script>/runTemporaryTestSuite.sh", scenario};
ProcessBuilder pb2 = new ProcessBuilder(command2);
Process p2 = pb2.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p2.getInputStream()));
String line;
//print - is an object ref of response.getWriter() //
print.println("Output of running "+Arrays.toString(command2)+" is: ");
while ((line = br.readLine()) != null) {
    print.println(line);
}

try {
   int exitValue = p2.waitFor();
   print.println("<br><br>Exit Value of p2 is " + exitValue);
} catch (InterruptedException e) {
   e.printStackTrace();
}

runTemporaryTestSuite.sh

#!/bin/bash
sh <path to script>/clearRegressionResult.sh   (This runs fine)
sh <path to script>/startRegression.sh $1 (This is where the issue occurs)

startRegression.sh 看起来像:

SUITE_PATH="./"
java -DconfigPath=${SUITE_PATH}/config.xml -Dscenario=$1 -Dauto=true -jar test.jar

我的输出: 运行 [/bin/bash, /runTemporaryTestSuite.sh, 29] 的输出是: p2的退出值为1

非常感谢任何帮助解决这个问题。

【问题讨论】:

    标签: java shell processbuilder exit-code


    【解决方案1】:

    认为问题不在于您无法启动带参数的 shell 脚本,我很好奇并进行了测试

    public class Main {
    
    public static void main(String[] args) throws IOException {
        String[] command = {"/bin/bash", "test.sh", "Argument1"};
        ProcessBuilder p = new ProcessBuilder(command);
        Process p2 = p.start();
        BufferedReader br = new BufferedReader(new InputStreamReader(p2.getInputStream()));
        String line;
    
        System.out.println("Output of running " + command + " is: ");
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
    

    这里是 test.sh 脚本

    echo Hello im the script, here your args $@
    

    这里是输出

    Output of running [Ljava.lang.String;@604e9f7f is: 
    Hello im the script, here your args Argument1
    

    我认为只是你的 startRegression.sh 以非 0 状态退出(也就是它在某处失败)并且它有影响,runTemporaryTestSuite.sh 也将以非零状态退出,依此类推,因此消息: p2 的退出值为 1

    我现在看到的,

    SUITE_PATH="./" java -DconfigPath=${SUITE_PATH}/config.xml [..] configPath 将是 .//config.xml 所以也许你有一个找不到普通文件的问题?我可能错了,希望对你有帮助

    【讨论】: