【发布时间】:2013-07-25 21:01:53
【问题描述】:
我有一个 java 代码,它获取一个数据文件,将数据复制到 perl 脚本,并从 shell 脚本调用 perl 脚本。以下是相关代码:
public String returnStringForPerlScript(ArrayList<String> arrayContainingPerlScriptArguments, String singularFilePath) throws IOException{
String argFileName = null;//5
String argParsedFileName = null;//
argParsedFileName = arrayContainingPerlScriptArguments.get(4);
argFileName = arrayContainingPerlScriptArguments.get(5);
System.out.print("ARG1: "+argFileName);
System.out.print(" ARG2: "+argParsedFileName);
String runCmdString = singularFilePath+"perlscript.pl";
String runCmd = singularFilePath+"runPerlScript.sh";
return runCmd;
}
上面的代码是一个单独的类中的方法。下面的代码是 Process 实际初始化和运行的地方。
p = dfp.returnStringForPerlScript(perlParam, singularDirectoryPath);
System.out.println("Running from: "+p);
process = Runtime.getRuntime().exec(p);
令人困惑的是,这段代码之前运行得很好,而我改变的只是输出目录。我写了一个完全不同的文件路径,而不是“singularDirectoryPath”。我很困惑,因为我不知道代码有什么问题,考虑到它之前运行过。当我从终端调用“runPerlScript.sh”时,它起作用了。
我还应该补充一点,我确实尝试使用 String[] 而不是字符串,如下所示:
String[] cmdArray = {"/bin/tcsh","-c","/filepath/runPerlScript.sh"};
Process p = Runtime.getRuntime().exec(cmdArray);
仍然没有生成任何输出文件。
【问题讨论】:
-
shell 脚本或 perl 脚本都不是真正的可执行文件。他们依赖于一个 shell,这与
exec()无关。 -
当你说它不起作用时,它实际上做了什么?它会抛出错误吗?如果是,您可以添加堆栈跟踪吗?还请描述它曾经作为参数的值(当它工作时),你现在更改的新值是什么,打印语句的输出会很好
-
@c.s 抱歉,我应该更具体一些。我的意思是,当我说它不起作用时,我将它与生成输出文件时与现在未生成输出文件时进行比较。之前,当我调用 shell 脚本时,会生成许多输出文件。现在,当我调用 shell 脚本时,不会生成任何输出文件。此外,不会引发任何错误。我更改的唯一值是“singularDirectoryPath”,它基本上只是更改了应该调用 runPerlScript.sh 脚本的目录。
-
@BrianRoach 一个脚本可以直接被java调用,它只需要有适当的权限并且在第一行有对其解释器的引用
标签: java