shell脚本文件目录:/some/location/myShellScript.sh
Properties-Type:Shell脚本(application / x-shellscript)
编辑
shell脚本的内容:
#!/bin/bash
export LD_LIBRARY_PATH=`pwd`
echo `pwd`
./someExecutable ../input/cfg/test1.ini
test1.ini是在Java代码之前一步生成的, 它提供了一些测试设置,这些设置在后台完成。然后,shell脚本以我需要进一步处理的文件结束。
/ EDIT
当我仅使用“ ./myShellScript.sh”在linux终端上的自己的目录中运行此Shell脚本时,它就可以正常工作...
我的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,但我不知道为什么...
我尝试了很多类似的事情:
在我的执行目录中,我递归地更改了chmod 755 -R *的权限,因此shell脚本使用的每个关联库的确可用(同样由于事实,我可以在终端上执行它)。
我确实试图在互联网上找到正确的答案,但没有成功。
否,我不能只用Java做所有事情,shell脚本是强制性的,在这种情况下不能替换。
提前感谢有用的建议!
答案 0 :(得分:1)
127
退出状态意味着找不到脚本中使用的命令。
编辑
调试脚本,使用bash时,在第二行下面添加以下行:
exec > /tmp/debug.txt 2>&1 ; set -x
下一次尝试后,分析在/tmp/debug.txt
文件中生成的跟踪。
OLD INTRO
(尚未提供脚本内容)
执行myShellScript.sh
脚本的Java程序可能与您从终端手动执行脚本时在环境中设置的PATH
环境变量不同。
答案 1 :(得分:1)
您正在执行的脚本对其工作目录非常敏感。它使用pwd
来设置LD_LIBRARY_PATH
,并尝试通过该程序的相对路径执行另一个程序,并提供一个相对路径作为命令行参数。
执行脚本的工作目录与脚本所在的目录没有本质关系,它完全取决于启动脚本的方式和环境。例如,您报告该脚本按预期工作,即“当我在自己的目录中[...] 运行该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
不过,对路径进行硬编码有点麻烦。您可以通过having the script identify its own directory at runtime进一步改进它:
#!/bin/bash
installation_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
export LD_LIBRARY_PATH=$installation_dir
"$installation_dir"/someExecutable "$installation_dir"/../input/cfg/test1.ini
这显然是特定于Bash的,但是无论如何您都在使用bash。另外,如果您的脚本启动的可执行文件对其工作目录也是 敏感的,那么也许您只是希望脚本更改目录(这仅对脚本及其下游的进程有效,而对于其父进程):
#!/bin/bash
cd "$( dirname "${BASH_SOURCE[0]}" )"
export LD_LIBRARY_PATH=`pwd`
./someExecutable ../input/cfg/test1.ini