[英]Symbol lookup error only when terminal opened through a java application
我写了一个bash脚本。 举个例子,一个很简单的例子是:
#!/bin/bash
gnuplot -e "set terminal pdf; set output'/tmp/test.pdf'; plot [-10:10] sin(x);"
该脚本的名称应为test.sh。 我可以通过外壳执行此脚本,并创建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,如果java-jar文件是通过shell执行的,则gnuplot脚本得以执行。 如果将其嵌入到另一个看起来像execute_jar.sh这样简化的外壳中:
#!/bin/bash
java -jar test.jar
这个execute_jar.sh由另一个Java应用程序执行,该Java应用程序只能执行shell脚本,并且我无法修改。 此父应用程序有问题吗? 还是有可能的解决方法? gnuplot脚本必须通过我的test.jar执行,因为其他参数是在jar中生成并提供给脚本的。
-更新2-
因此,我一直在搜索更多内容并进行测试,我更改了test.jar使其不执行test.sh,而仅使用“ xterm”打开了一个外壳。 然后,我在这里手动键入脚本,并得到错误"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-
我改变了标题
添加到行尾。
#!/bin/bash
gnuplot -e "set terminal pdf; set output'/tmp/test.pdf'; plot [-10:10] sin(x);"
到可执行文件;
chmod +x /tmp/test.sh
这是java代码; 运行此命令时,将在/ tmp /中创建test.pdf。
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控制台输出是什么?
脚本实际上不是可执行文件。 shebang( #!
)由您的命令解释程序解释。 ProcessBuilder不会那样做。 要从Java运行此程序,您需要直接执行/ bin / bash并将此脚本作为命令行参数传递。
例:
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "test.sh");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.