设置LD_LIBRARY_PATH=`pwd`的Shell脚本在Java中不起作用
shell脚本文件目录:/some/location/myShellScript.sh 属性类型:shell脚本(应用程序/x-shell脚本) 编辑 shell脚本的内容:设置LD_LIBRARY_PATH=`pwd`的Shell脚本在Java中不起作用,java,bash,shell,processbuilder,runtime.exec,Java,Bash,Shell,Processbuilder,Runtime.exec,shell脚本文件目录:/some/location/myShellScript.sh 属性类型:shell脚本(应用程序/x-shell脚本) 编辑 shell脚本的内容: #!/bin/bash export LD_LIBRARY_PATH=`pwd` echo `pwd` ./someExecutable ../input/cfg/test1.ini test1.ini是在java代码中的前一步生成的, 它为一些测试提供设置,这些测试是在后台完成的。然后,shell脚本以我需要进一步处理
#!/bin/bash
export LD_LIBRARY_PATH=`pwd`
echo `pwd`
./someExecutable ../input/cfg/test1.ini
test1.ini是在java代码中的前一步生成的,
它为一些测试提供设置,这些测试是在后台完成的。然后,shell脚本以我需要进一步处理的文件结束
/EDIT
当我在linux终端上用“/myShellScript.sh”在自己的目录下运行这个shell脚本时,它工作得非常好…
应执行my shell脚本的一部分:
//Do something before
//Shell scripts creates a file
String cmd = /some/location/myShellScript.sh;
ProcessBuilder pb = new ProcessBuilder(cmd);
Process process = pb.start();
int exitValue = process.waitFor();
System.out.println(exitValue);
//Afterwards I am processing the generated file
当我的java程序作为一个可执行的.jar文件运行时,这个过程不会被执行,exitValue是127,但我不知道为什么
我尝试了很多东西,比如:
- 使用运行时执行
- 添加#/bin/bash或#/shell脚本顶部的bin/sh
- 以字符串[]的形式向进程命令添加“sh”参数
提前感谢您提供的有用建议 退出状态意味着找不到脚本中使用的命令 编辑 调试脚本,使用bash时,在第二行添加以下行:
exec > /tmp/debug.txt 2>&1 ; set -x
下一次尝试后,分析生成到/tmp/debug.txt
文件中的跟踪
旧介绍
(尚未提供脚本内容)
执行
myShellScript.sh
脚本的Java程序的路径
环境变量可能与从终端手动执行脚本时在您的环境中设置的环境变量不同。退出状态意味着找不到脚本中使用的命令
编辑
调试脚本,使用bash时,在第二行添加以下行:
exec > /tmp/debug.txt 2>&1 ; set -x
下一次尝试后,分析生成到/tmp/debug.txt
文件中的跟踪
旧介绍
(尚未提供脚本内容)
执行
myShellScript.sh
脚本的Java程序的路径
环境变量可能与从终端手动执行脚本时在您的环境中设置的环境变量不同。您正在执行的脚本对其工作目录高度敏感。它使用pwd
设置LD_LIBRARY_路径
,并尝试通过该程序的相对路径执行另一个程序,同时提供相对路径作为命令行参数
脚本执行的工作目录与脚本所在的目录没有本质关系——它完全取决于脚本如何启动以及在什么上下文中启动。例如,您报告该脚本按照预期工作,“当我在自己的目录下运行该shell脚本[…]”时,但当您从Java运行该脚本时,您很可能没有在自己的目录下运行该脚本作为工作目录,这将严重影响该脚本的行为
一种解决方案是将脚本的安装路径硬编码到脚本本身中,并表示与此相关的所有路径:
#!/bin/bash
installation_dir=/path/to/the/script/dir
export LD_LIBRARY_PATH=$installation_dir
"$installation_dir"/someExecutable "$installation_dir"/../input/cfg/test1.ini
不过,对路径进行硬编码有点笨拙。您可以通过以下方式进一步改进:
这显然是特定于Bash的,但无论如何,您都在使用Bash。或者,如果脚本启动的可执行文件也对其工作目录敏感,那么您可能只希望脚本更改目录(这将仅对脚本及其下游进程有效,而不是对其父进程有效):
您正在执行的脚本对其工作目录高度敏感。它使用
pwd
设置LD_LIBRARY_路径
,并尝试通过该程序的相对路径执行另一个程序,同时提供相对路径作为命令行参数
脚本执行的工作目录与脚本所在的目录没有本质关系——它完全取决于脚本如何启动以及在什么上下文中启动。例如,您报告该脚本按照预期工作,“当我在自己的目录下运行该shell脚本[…]”时,但当您从Java运行该脚本时,您很可能没有在自己的目录下运行该脚本作为工作目录,这将严重影响该脚本的行为
一种解决方案是将脚本的安装路径硬编码到脚本本身中,并表示与此相关的所有路径:
#!/bin/bash
installation_dir=/path/to/the/script/dir
export LD_LIBRARY_PATH=$installation_dir
"$installation_dir"/someExecutable "$installation_dir"/../input/cfg/test1.ini
不过,对路径进行硬编码有点笨拙。您可以通过以下方式进一步改进:
这显然是特定于Bash的,但无论如何,您都在使用Bash。或者,如果脚本启动的可执行文件也对其工作目录敏感,那么您可能只希望脚本更改目录(这将仅对脚本及其下游进程有效,而不是对其父进程有效):
请输入并包含shell脚本的内容,如果不知道它在做什么,就很难确定它为什么以非零代码退出。@arco444-成功了。您应该尝试使用process.directory(新文件(“/some/location”);在脚本运行时设置目录。否则,请将脚本更改为使用完全限定的路径名-/some/locati