System.getenv 仍然在 MacOS Mojave 上获取已删除的环境变量值 - Java
System.getenv still picks up deleted env variable value on MacOS Mojave - Java
我在我的 bash_profile 和配置文件中添加了一些可导出的环境变量,导出格式如下 "X=y"。这正常工作,现在我想永久删除它们。我尝试了以下方法:
- 正在从 bash_profile 和配置文件中删除导出的变量,并保存文件,并调用 source ~/.bash_profile 和 source ~/.profile.
- 在终端 window 中调用了 "unset X"。在我可以调用显示 y 的 "echo $X" 之前,现在它什么都不显示。
- 正在重新启动 Mac 计算机。
然而,每当我调用 Java 的 System.getenv(X) 时,仍然会返回环境变量 X 的值 (y)。在 MacOS Mojave 中,我还需要做什么才能从我的系统中完全消除环境变量?
您似乎认为环境变量是全局变量。也就是说,修改一个程序中的值,例如 运行ning 终端,将影响另一个程序中的值。这不是像 OS 这样的 UNIX 环境变量的工作方式。每个进程都提供了父进程提供的环境变量的副本。也就是说,它们是从父进程继承的。
您必须在终端中 unset X
才能删除它这一事实意味着它要么被终端进程的 shell 继承,要么是您的 shell 正在设置它.在后一种情况下,shell 启动时读取的特定文件取决于 shell。但是 /etc/profile 被大多数互动 shell 阅读,所以你可能想看看那里。
您说您的 Java 应用是 Tomcat 的 运行,但没有提及 Tomcat 是如何启动的。由于我上面提到的原因,这很重要。
请注意,macOS 使用名为 launchd
的守护进程来管理 运行 大部分服务。这些服务是通过 "plist" 文件配置的。参见 man launchd.plist
。这些启动的配置文件支持定义自定义环境变量。这有点不寻常,但值得一看。查看 ~/Library/LaunchAgents、/Library/LaunchAgents 或 [=33= 中的任何文件] 提及环境变量。
我在我的 bash_profile 和配置文件中添加了一些可导出的环境变量,导出格式如下 "X=y"。这正常工作,现在我想永久删除它们。我尝试了以下方法:
- 正在从 bash_profile 和配置文件中删除导出的变量,并保存文件,并调用 source ~/.bash_profile 和 source ~/.profile.
- 在终端 window 中调用了 "unset X"。在我可以调用显示 y 的 "echo $X" 之前,现在它什么都不显示。
- 正在重新启动 Mac 计算机。
然而,每当我调用 Java 的 System.getenv(X) 时,仍然会返回环境变量 X 的值 (y)。在 MacOS Mojave 中,我还需要做什么才能从我的系统中完全消除环境变量?
您似乎认为环境变量是全局变量。也就是说,修改一个程序中的值,例如 运行ning 终端,将影响另一个程序中的值。这不是像 OS 这样的 UNIX 环境变量的工作方式。每个进程都提供了父进程提供的环境变量的副本。也就是说,它们是从父进程继承的。
您必须在终端中 unset X
才能删除它这一事实意味着它要么被终端进程的 shell 继承,要么是您的 shell 正在设置它.在后一种情况下,shell 启动时读取的特定文件取决于 shell。但是 /etc/profile 被大多数互动 shell 阅读,所以你可能想看看那里。
您说您的 Java 应用是 Tomcat 的 运行,但没有提及 Tomcat 是如何启动的。由于我上面提到的原因,这很重要。
请注意,macOS 使用名为 launchd
的守护进程来管理 运行 大部分服务。这些服务是通过 "plist" 文件配置的。参见 man launchd.plist
。这些启动的配置文件支持定义自定义环境变量。这有点不寻常,但值得一看。查看 ~/Library/LaunchAgents、/Library/LaunchAgents 或 [=33= 中的任何文件] 提及环境变量。