System.getenv仍然在MacOS Mojave-Java上拾取已删除的env变量值

System.getenv仍然在MacOS Mojave-Java上拾取已删除的env变量值,java,environment-variables,system,macos-mojave,Java,Environment Variables,System,Macos Mojave,我在我的bash_概要文件和我的概要文件中添加了一些可导出的环境变量,格式为export“X=y”。这是它应该工作,现在我想永久删除它们。我尝试了以下方法: 从bash_概要文件和概要文件中删除导出的变量,保存这些文件,并调用source~/.bash_概要文件和source~/.profile 在终端窗口中称为“取消设置X”。在我调用“echo$X”之前,它会显示y,现在它什么也不显示 重新启动Mac电脑 然而,每当我调用Java的System.getenv(X)时,仍然会返回env变量X的值

我在我的bash_概要文件和我的概要文件中添加了一些可导出的环境变量,格式为export“X=y”。这是它应该工作,现在我想永久删除它们。我尝试了以下方法:

  • 从bash_概要文件和概要文件中删除导出的变量,保存这些文件,并调用source~/.bash_概要文件和source~/.profile
  • 在终端窗口中称为“取消设置X”。在我调用“echo$X”之前,它会显示y,现在它什么也不显示
  • 重新启动Mac电脑

  • 然而,每当我调用Java的System.getenv(X)时,仍然会返回env变量X的值(y)。我还需要做什么才能从MacOS Mojave中的系统中完全消除一个env变量

    您似乎认为环境变量是全局的。也就是说,修改一个程序(如正在运行的终端)中的值将影响另一个程序中的值。这不是env-vars在类UNIX操作系统中的工作方式。每个进程都提供了父进程提供的环境变量的副本。也就是说,它们是从父进程继承的

    您必须在终端中
    取消设置X
    才能删除它,这意味着shell正在从终端进程继承它,或者您的shell正在设置它。在后一种情况下,shell启动时读取的特定文件取决于shell。但是/etc/profile被大多数交互式shell读取,所以您可能想看看那里

    你说你的Java应用程序是由Tomcat运行的,但没有提到Tomcat是如何启动的。出于我上面提到的原因,这一点很重要


    请注意,macOS使用名为
    launchd
    的守护进程来管理运行的大多数服务。这些服务是通过“plist”文件配置的。请参见
    人工发射.plist
    。这些启动配置文件支持定义自定义环境变量。这有点不寻常,但值得一看。查看~/Library/LaunchAgents、/Library/LaunchAgents或/Library/LaunchDaemons中的任何文件是否提到环境变量。

    在我的Windows框中,更新的环境列表通常需要重新启动电脑(无论是添加还是删除)被读取。忘记添加了,我重新启动了我的mac,仍然得到了相同的结果。你检查过像
    ~/.bashrc
    这样的其他文件吗?我检查过~/.bashrc,还有其他文件需要注意吗?谢谢Ivan。您需要解释一下如何启动java程序。另外,现在您已经从个人bash配置文件中删除了var,如果在新的终端实例中
    echo$X
    会发生什么?我在LaunchAgent或守护进程中没有看到任何内容,但是我确实使用catalina.sh文件通过终端启动tomcat。
    catalina.sh
    的第一行是什么?如果是类似于
    #/bin/bash
    则它不会读取任何点文件,除非设置了env var
    bash_env
    。运行该脚本时,您是否首先验证未设置
    X
    (或其名称)?