我正在尝试从Java执行第三方命令行应用程序。该应用程序称为CWB。我正在使用以下代码:

process = Runtime.getRuntime().exec(script.sh);

LinkedList<String> stringList = new LinkedList<String>();

BufferedReader reader = new BufferedReader(
    new InputStreamReader(process.getInputStream()));

String line = "";

while ((line = reader.readLine()) != null) {
    stringList.add(line);
}

int exitVal = 0;

exitVal = process.waitFor();
if (exitVal == 0) {
    // Success
    return stringList;
} else {
    // Failure
    return null;
}


这些命令放在文件script.sh中(我在Linux中)。该脚本包含以下两个命令:

# Run CWB application from Terminal
./cwb-nc-ccs-x86-linux.bin
# Execute a CWB-specific command
load file_name.ccs


从终端执行CWB以及通过Runtime.getRuntime().exec()在Java中执行CWB时,行为是不同的。从终端执行CWB时,获得以下输出:

CWB_output_from_terminal

但是,当我通过Runtime.getRuntime().exec()从Java执行时,我会在控制台中获得以下输出:

The Concurrency Workbench of the New Century
(Version 1.2 --- June, 2000)


也就是说,Java中的Shell在命令./cwb-nc-ccs-x86-linux.bin之后停止执行。我认为原因是,当我开始CWB流程时,就好像我输入了一个新的“环境”一样。可以注意到,因为我在上面键入命令的光标行以cwb-nc>开头,如上图所示。因此,由于Java位于新的“环境”中而不位于Shell中,因此它不知道如何将命令传递给该环境。我对吗?如何解决此问题并在脚本(load file_name.ccs)中执行其他命令?

最佳答案

如果您尝试在Java之外运行脚本,那么您会发现它在Java中也不起作用。您应该专注于编写首先起作用的脚本,并且仅尝试在起作用时从Java调用它。

脚本的问题在这里详细说明:Pass commands as input to another command (su, ssh, sh, etc)

但是,由于您是从Java运行的,因此您可能并且应该纯粹在Java中实现此功能而无需使用shell脚本:

process = Runtime.getRuntime().exec(new String[] { "./cwb-nc-ccs-x86-linux.bin" });
PrintStream writer = new PrintStream(process.getOutputStream());
writer.println("load file_name.ccs");
writer.close();
...

10-04 23:18
查看更多