仅当终端通过Java应用程序打开时,符号查找错误

时间:2016-09-28 12:03:39

标签: java bash gnuplot libraries

我写了一个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 ---

我更改了标题

2 个答案:

答案 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");