设置LD_LIBRARY_PATH =`pwd`的Shell脚本不适用于Java

问题描述 投票:0回答:2

shell脚本文件目录:/some/location/myShellScript.sh

属性类型:shell脚本(application / x-shellscript)

编辑

shell脚本的内容:

#!/bin/bash
export LD_LIBRARY_PATH=`pwd`
echo `pwd`
./someExecutable ../input/cfg/test1.ini

test1.ini是在java代码之前生成的,它提供了一些测试的设置,这些设置在后台完成。然后shell脚本最终得到我需要进一步处理的文件。

/编辑

当我在linux终端上使用“./myShellScript.sh”在自己的目录中运行这个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,但我不知道为什么......

我尝试过很多东西:

  • 使用Runtime来执行
  • 在shell脚本之上添加#!/ bin / bash或#!/ bin / sh
  • 以String []的形式向流程命令添加“sh”参数

在我的执行目录中,我用chmod 755 -R *递归地更改了权限,因此shell脚本使用的每个关联库确实可用(也是因为我可以在终端上执行它)。

我真的试图在互联网上找到一个正确的答案,但我没有成功。

不,我不能只在java中执行所有操作,shell脚本是必需的,在这种情况下无法替换。

在此先感谢您提供有用的建议!

java bash shell processbuilder runtime.exec
2个回答
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

1
投票

127退出状态表示找不到脚本中使用的命令。

编辑

调试脚本,使用bash时,在第二行添加以下行:

exec > /tmp/debug.txt 2>&1 ; set -x

在下一次尝试之后,分析生成到/tmp/debug.txt文件中的跟踪。

OLD INTRO(尚未提供脚本内容)执行myShellScript.sh脚本的Java程序可能与您从终端手动执行脚本时在环境中设置的PATH环境变量不同。

© www.soinside.com 2019 - 2024. All rights reserved.