0

2 つのパラメーターを使用する Java でシェル スクリプトを呼び出しています。

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");
        }
    }

ここで件名とメッセージをシェル スクリプトに渡すと、内容が適切に解析されません。

ここで、Subject="Hello This is a test mail" の場合とします。次に、シェル スクリプトは、サブジェクトがHelloであり、メッセージがThisであると見なします。

ここでは、文字列内のスペースが問題を引き起こしていると推測しています。

どうすればこの問題を解決できますか。

4

3 に答える 3

1

コマンドに ではなくを使用するバージョンの を使用する必要Runtime.execがあるため、単語への分割方法を制御できます。または、 を使用してください。また、呼び出す前にプロセスの出力ストリームを読み取るか、明示的に破棄する必要があります。そうしないと、ブロックされる可能性がありますString[]StringProcessBuilderwaitFor

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 に答える