我写了一个bash脚本。举个例子,真的很容易:
#!/bin/bash
gnuplot -e "set terminal pdf; set output'/tmp/test.pdf'; plot [-10:10] sin(x);"
此脚本的名称为test.sh。 我可以通过我的shell执行这个脚本,并创建test.pdf。我应该通过通过ProcessBuilder调用此脚本的Java应用程序来执行此脚本,而不是创建pdf。访问该脚本并打开gedit等其他程序。 Awk等工作。 gnuplot似乎有问题。
有谁知道为什么会这样,以及如何解决这个问题?
java代码是:
String command = "/tmp/test.sh";
try {
ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c",command);
pb.start();
}catch (IOExeption e1) {
e1.printStackTrace()
}
---更新---
似乎还有另一个问题。感谢ccarton和muzido,如果通过shell执行java-jar文件,则会执行gnuplot脚本。如果我将它嵌入到另一个看起来像这个execute_jar.sh简化的shell中:
#!/bin/bash
java -jar test.jar
这个execute_jar.sh由另一个只能执行shell脚本且我无法修改的java应用程序执行。 这个父应用程序有问题吗?或者是可行的解决方案? gnuplot脚本必须通过我的test.jar执行,因为其他参数在jar中生成并提供给脚本。
---更新2 ---
所以我一直在搜索更多并测试一下我改变了test.jar,这样它就不会执行test.sh而只是打开一个带有“xterm”的shell。然后我在这里手动输入脚本,我收到错误"gnuplot: symbol lookup error: /usr/lib64/libQtSvg.so.4: undefined symbol"
有什么想法吗?
---更新3 ---
我认为它是一个库问题,因为“/usr/lib64/libQtSvg.so.4”存在。所以我尝试export LD_LIBRARY:$LD_LIBRARY:/usr/lib64
,但仍然是同样的错误。
---更新4 ---
我更改了标题
答案 0 :(得分:0)
添加到"行尾。
#!/bin/bash
gnuplot -e "set terminal pdf; set output'/tmp/test.pdf'; plot [-10:10] sin(x);"
到可执行文件;
chmod +x /tmp/test.sh
这是java代码;运行时,test.pdf在/ tmp /中创建。
public class RunShellScript
{
public static void main(String[] args)
{
String command = "/tmp/test.sh";
try{
ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c",command);
Process p = pb.start();
p.waitFor();
int shellExitStatus = p.exitValue();
System.out.println(shellExitStatus);
}catch(Exception e){
e.printStackTrace();
}
}
}
运行时,java控制台输出是什么?
答案 1 :(得分:0)
脚本实际上不是可执行文件。 shebang(#!
)由您的命令shell解释。 ProcessBuilder不会这样做。要从Java运行它,您需要直接执行/ bin / bash并将此脚本作为命令行参数传递。
示例:
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "test.sh");