2011-10-30 35 views
1

我试着从Java程序运行一个shell脚本,但整个脚本没有被执行。想法为什么我们会遇到这样的问题?只从Java程序执行脚本的一部分

的Java代码执行shell脚本:

File file = new File("/path/to/script"); 
String COMMAND= "./run"; 
ProcessBuilder p = new ProcessBuilder(COMMAND); 
p.directory(file); 
try { 
    Process startProcess= p.start(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

脚本运行正常,但不执行整个脚本。似乎只有第一行正在执行。

+0

脚本的第一行是什么?你是否只有第一条线路运行? – Mat

+0

另请参阅此可能的重复:[无法从java(使用ProcessBuilder)启动程序](http://stackoverflow.com/questions/1043611/failure-to-start-program-from-java-using-processbuilder) – trashgod

+0

每当我听说过这个问题,并且看到上面的代码,它提醒我建议阅读并执行[When Runtime.exec()的所有提示不会](http://www.javaworld.com/javaworld/jw- 12-2000/JW-1229-traps.html)。消费(并以某种方式报告)“Process”的'System.out' /'err'可能是照亮的(或者甚至是问题的根源)。 –

回答

1

如果您确定该脚本开始运行,则问题不在java中,而是在脚本本身中。

差异的原因可能是错误的路径或错误的环境。当您从控制台运行脚本时,您处于用户环境中,因此脚本可以使用所有环境变量。

尝试添加一些调试输出来解决问题。

+0

嗨, 脚本运行良好,当我通过终端在Ubuntu上运行它。但是相同的脚本并不是完全从java程序执行的。该脚本有一些tinyos命令。 当我试图用'make'来运行带有tinyos命令的脚本时,我也遇到了同样的问题。 谢谢。 – Ashish

+0

几乎可以肯定的是,您的终端设置中的PATH设置为单向,而在您的Java环境中则不同。正如AlexR所说,向脚本添加一些调试消息,或者将完整路径前缀添加到您在脚本中执行的所有命令。祝你好运。 – shellter

+0

嗨,路径没有问题,我猜,问题是环境变量。脚本中未执行的部分是: if cygpath -w />/dev/null 2>/dev/null;然后 CLASSPATH = “oscilloscope.jar; $ CLASSPATH” 其他 CLASSPATH = “oscilloscope.jar:$ CLASSPATH” 网络 java的示波器 此外,回声......剧本里没有给出任何输出,当脚本从java程序执行。当我从终端运行脚本时,我可以看到输出。 Ashish。 – Ashish