gpt4 book ai didi

java - 设置 LD_LIBRARY_PATH =`pwd` 的 Shell 脚本在 Java 中不起作用

转载 作者:行者123 更新时间:2023-12-02 01:57:37 24 4
gpt4 key购买 nike

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 终端的自己的目录中运行这个 shell 脚本时,只需使用“./myShellScript.sh”,它就可以正常工作......

我的 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,但我不知道为什么......

我尝试了很多事情,例如:

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

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

我确实尝试在互联网上找到正确的答案,但没有成功。

并且,我不能只用java做所有事情,shell脚本是强制性的,在这种情况下不能被替换。

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

最佳答案

您正在执行的脚本对其工作目录高度敏感。它使用 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

关于java - 设置 LD_LIBRARY_PATH =`pwd` 的 Shell 脚本在 Java 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52098777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com