0

我在java中调用一个shell脚本,它需要2个参数。

private void invokeShellScript(String script,String subject,String message)
    {
        String shellCmd = null;
        try
        {
            shellCmd = script.trim() + " " + subject + " " + message;

            Process process=Runtime.getRuntime().exec(shellCmd);
            process.waitFor();
        }
        catch(Exception e)
        {
             LOGGER.error("Exception occured while invoking the message report script");
        }
    }

在这里,当我将主题和消息传递给 shell 脚本时,它没有正确解析内容。

这里说 If the subject="Hello This is a test mail"。然后 shell 脚本认为 subject 是Hello并且 message 是This

在这里,我猜测字符串中的空格会导致问题。

我该如何解决这个问题。

4

3 回答 3

2

Try quoting the strings when you pass them to shell.

So either

"\"Hello This is a test mail\""

or

"'Hello This is a test mail'"

(in java)

于 2013-05-20T14:10:51.257 回答
1

您需要使用Runtime.exec带有 aString[]作为命令的版本而不是 a String,因此您可以控制如何将其拆分为单词。或者更好的是,使用ProcessBuilder. 您还需要在调用之前读取或显式丢弃进程的输出流,waitFor否则可能会阻塞

try {
  ProcessBuilder pb = new ProcessBuilder(script, subject, message);
  pb.redirectErrorStream(true);
  pb.redirectOutput(new File("/dev/null"));
  Process process = pb.start();
  process.waitFor();
}
catch(Exception e) {
  LOGGER.error("Exception occured while invoking the message report script");
}

Process.redirectOutput是 Java 7 的发明,如果您仍在使用 6,则process.getOutputStream()在调用之前必须阅读并丢弃自己的内容waitFor)。

于 2013-05-20T15:20:02.950 回答
0

尝试使用 arraylist 单独输入所有参数,并将该列表作为命令提供给ProcessBuilder.

final List<String> commands = new ArrayList<String>();                

commands.add(Script.trim());
commands.add(subject);
commands.add(message);

ProcessBuilder pb = new ProcessBuilder(commands);

这应该可以很好地工作,因为 java 会将它们视为单独的争论。

于 2013-05-20T15:16:32.900 回答