Java Runtime.getRuntime().exec异常行为

Java Runtime.getRuntime().exec异常行为,java,linux,perl,bash,runtime.exec,Java,Linux,Perl,Bash,Runtime.exec,我试图从java运行时调用perl脚本。它在我的windows7笔记本电脑上运行良好,代码如下: try { String cmdString= "c:\\perl64\\bin\\perl.exe c:\\perl64\\eg\\userinput.pl \""+arg1+"\" \""+arg2+"\""; Process p = Runtime.getRuntime().exec(cmdString); } catch(IOException e) { System

我试图从java运行时调用perl脚本。它在我的windows7笔记本电脑上运行良好,代码如下:

try {
    String cmdString= "c:\\perl64\\bin\\perl.exe c:\\perl64\\eg\\userinput.pl \""+arg1+"\" \""+arg2+"\"";
    Process p = Runtime.getRuntime().exec(cmdString);
} catch(IOException e) {
    System.out.println(e);
}
perl脚本运行并生成我所期望的内容(更新数据库)

当我把整个东西移到远程CentOS服务器上时,它就不再工作了。脚本是相同的,java代码是

try {
    String cmdString= "/opt/lampp/bin/perl /home/support/scripts/userinput.pl \""+arg1+"\" \""+arg2+"\" > /tmp/userinput.log";
    log(cmdString);
    Process p = Runtime.getRuntime().exec(cmdString);
} catch(IOException e) {
    System.out.println(e);
}
在看到脚本不工作后,我将重定向添加到/tmp/userinput.log。但根本没有创建任何日志文件。我还添加了日志,以确保java代码的这一部分确实得到了执行,而且确实得到了执行。我还尝试在comString前面添加“/bin/bash”,但没有任何区别。但是,当我从命令行直接在远程服务器上运行cmdString时,它可以正常工作

现在,当我将cmdString更改为“touch/tmp/userinput.log”时,它确实创建了空日志文件

因此,我知道运行Runtime.getRuntime().exec(cmdString)命令,并且当在命令行中输入cmdString时,cmdString可以工作,一个简单的“touch”命令可以用于此设置。但是我完全不明白为什么调用perl脚本的实际cmdString不起作用,并且没有任何消息告诉我出了什么问题


有人能帮忙吗

首先,分离命令的每个参数,并使用exec版本,该版本采用
字符串[]
(您不必担心引用问题)。此外,shell重定向也不起作用,因为java没有执行shell。

shell重定向不起作用会让我偏离正轨。实际上,调用了perl脚本。它不会运行,因为参数周围有双引号。它的行为与windows上的不同。你的建议在金钱上是正确的。谢谢