如何在Java中执行shell脚本

如何在Java中执行shell脚本,java,linux,shell,ksh,Java,Linux,Shell,Ksh,我必须在Linux机器中运行Java的shell脚本 例如, 下面是脚本路径和脚本所需的所有参数 "ksh /xyz/abc/data/code_base/RUN_SCRIPTS/dev/my_script.sh param1 param2 20200901 459 121" 下面是代码 String script = "ksh /xyz/abc/data/code_base/RUN_SCRIPTS/dev/my_script.sh param1 param2 2

我必须在Linux机器中运行Java的shell脚本 例如, 下面是脚本路径和脚本所需的所有参数

"ksh /xyz/abc/data/code_base/RUN_SCRIPTS/dev/my_script.sh param1 param2 20200901 459 121"
下面是代码

String script = "ksh /xyz/abc/data/code_base/RUN_SCRIPTS/dev/my_script.sh param1 param2 20200901 459 121";
ProcessBuilder processBuilder = new ProcessBuilder();                       
processBuilder.command(script);
processBuilder.redirectErrorStream(true);
//start() will be in try catch
process = processBuilder.start();

int exitVal = process.waitFor();

if(exitVal == 0){
   //code
}
是否需要通过将每个脚本作为单独的字符串添加到列表中来将脚本作为列表传递? “ksh”、“/xyz/abc/data/code_base/RUN_SCRIPTS/dev/my_script.sh”、“param1”“param2”“20200901”“459”“121”

在我的Windows机器上,我打开一个记事本,如下所示,它工作正常

ProcessBuilder processBuilder = new ProcessBuilder("Notepad.exe", "C:/Dev/Test.txt");
processBuilder.redirectErrorStream(true);
process = processBuilder.start();

脚本是否会在Linux机器上正确执行,或者需要在代码中进行更多更改???

查看此运行时.getRunTime().exec

您应该能够使用
Runtime.exec()
ProcessBuilder
调用shell来运行脚本,但整个过程充满了陷阱

我建议阅读这篇文章:


这就解释了许多陷阱,以及如何避免它们。特别是,在Linux上,几乎肯定需要从shell调用中使用stdout和stderr——即使脚本不产生任何输出,有时也是如此。您还需要注意如何处理脚本参数中的空格和特殊字符(如果有)。Java用于命令行的解析器盲目地在空白处打断命令行。

“脚本是否能在Linux机器上正确执行”对于初学者来说,它在您的机器上工作吗?@FedericoklezCulloca-我正在Windows机器上编码,并打开一个记事本,用于测试。ProcessBuilder ProcessBuilder=newProcessBuilder(“Notepad.exe”、“C:/Dev/Test.txt”);这回答了你的问题吗@VinodKhade撇开具体情况不谈,无论如何,您都应该在linux上真正测试它。不要猜测兼容性。另外,不要期望安装
ksh
,它不是我能想到的任何linux发行版的标准。@FedericoklezCulloca-我们如何处理ksh?我们需要把所有这些放在一个字符串列表中吗?Like列表将包含“ksh”、“/xyz/abc/data/code_base/RUN_SCRIPTS/dev/my_script.sh”、“param1”“param2”“20200901”“459”“121”