Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过“设置和获取环境变量”;资料来源;来自Java代码的shell脚本_Java_Linux_Shell - Fatal编程技术网

通过“设置和获取环境变量”;资料来源;来自Java代码的shell脚本

通过“设置和获取环境变量”;资料来源;来自Java代码的shell脚本,java,linux,shell,Java,Linux,Shell,我正在编写Java控制台应用程序,它从环境变量(Linux)获取输入参数。要设置这些变量,我的应用程序必须“源”shell脚本。我可以使用Runtime.exec()或ProcessBuilder“源”脚本,但我不知道如何访问创建的环境变量 这是我的shell脚本(set_env.sh): 上面的脚本有Java代码“源代码”: ProcessBuilder pb = new ProcessBuilder("csh", "-c", "'source set_env.sh'"); P

我正在编写Java控制台应用程序,它从环境变量(Linux)获取输入参数。要设置这些变量,我的应用程序必须“源”shell脚本。我可以使用Runtime.exec()或ProcessBuilder“源”脚本,但我不知道如何访问创建的环境变量

这是我的shell脚本(set_env.sh):

上面的脚本有Java代码“源代码”:

    ProcessBuilder pb = new ProcessBuilder("csh", "-c", "'source set_env.sh'");
    Process p = null;
    try {
        p = pb.start();
        p.waitFor();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
如何访问创建的_DB变量,或者是否有其他解决方案

任何帮助都将不胜感激。 先谢谢你


好的,伙计们。谢谢你的回答。这是我暂时的解决办法。我编写了另一个脚本,它生成“源”并回显创建的变量。在Java代码中,我正在执行它,读取进程的输入流,然后解析它们。

您可以使用
System#getenv()
System#getenv(字符串名)
访问环境变量

从:

import java.util.Map;
公共类环境映射{
公共静态void main(字符串[]args){
Map env=System.getenv();
for(字符串envName:env.keySet()){
System.out.format(“%s=%s%n”,
我的名字,
env.get(envName));
}
}
}
但是,正如Sylvain Leroux和Serge Ballesta所提到的,使用
process#start()
创建的子进程不能修改其父进程的环境

如果您只想设置java代码使用的几个变量,那么java可能更适合

如何访问创建的_DB变量,或者是否有其他解决方案

你不能。当您“源”文件时,它实际上由您启动的子shell读取。此子shell的环境已修改。但是环境修改不会传播回父进程


据我所知,System.env是在JVM启动期间初始化的,在应用程序生命周期内不能修改它。 是和否。Java标准库不提供更改当前环境所需的调用。但不要想象环境不知何故被“锁定”了。事实上,这比这更简单:每个进程(shell、JVM实例、任何其他)在创建时都会收到其父环境的副本。您可以对副本执行您想要的操作,但由于它是一个副本,因此它不会与父级环境连接。当您启动一个新流程时,它会在创建时收到您的环境的副本

至于Java中的“missing”
setEnv
方法,这可能是(?)因为Sun的某个人认为这会打破“写一次,到处运行”的咒语,因为有些系统没有环境变量?看


顺便说一句,如果您需要一个自定义环境来启动一个外部进程,您实际上可以使用第二个参数

来构建您自己的环境,但我不确定是否得到了它。你会发布一些代码来显示你所做的事情和你的困境吗?这是一个非常糟糕的设计。您应该编写一个包装器脚本来生成shell脚本,然后执行Java程序。实现shell语法和语义不是Java的事,也不是应用程序的事。据我所知,System.env是在JVM启动期间初始化的,在应用程序生命周期内不能修改。@anton_l:是的!更确切地说,子进程永远不能修改其父进程的环境,因此,如果JVM启动一个shell,shell可以修改它自己的环境(以及它的一个环境子进程…),但JVM的环境永远不会更改。
    ProcessBuilder pb = new ProcessBuilder("csh", "-c", "'source set_env.sh'");
    Process p = null;
    try {
        p = pb.start();
        p.waitFor();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n",
                              envName,
                              env.get(envName));
        }
    }
}