gpt4 book ai didi

macos - Mac OS X 中的环境变量

转载 作者:行者123 更新时间:2023-12-03 04:13:39 26 4
gpt4 key购买 nike

更新:下面的链接没有完整的答案。必须在两个地方设置路径或变量(一个用于 GUI,一个用于 shell)是蹩脚的。

不重复:Setting environment variables in OS X?

<小时/>

来自 Windows 背景,设置和修改环境变量非常容易(只需转到“系统属性”>“高级”>“环境变量”),但在 Mac OS 10.5 上似乎并不那么简单。大多数引用文献都说我应该更新/etc/profile 或 ~/.profile。这些相当于系统变量和用户变量吗?例如,我应该在哪里设置 JAVA_HOME 变量?

<小时/>

编辑:

我希望能够从终端以及 Eclipse 等应用程序访问变量。另外,我希望我不必重新启动/注销即可使其生效。

最佳答案

有几个地方可以设置环境变量。

  • ~/.profile:将此用于要在从终端启动的所有程序中设置的变量(请注意,与 Linux 不同,在 Terminal.app 中打开的所有 shell 都是登录 shell)。
  • ~/.bashrc:这是为非登录 shell 的 shell 调用的。将此用于别名和其他需要在子 shell 中重新定义的内容,而不是用于继承的环境变量。
  • /etc/profile:它在 ~/.profile 之前加载,但在其他方面是等效的。当您希望变量应用于计算机上所有用户启动的终端程序(假设他们使用 bash)时,请使用它。
  • ~/.MacOSX/environment.plist:登录时由登录窗口读取。它适用于所有应用程序,包括 GUI 应用程序,但由 Spotlight 在 10.5(不是 10.6)中启动的应用程序除外。它要求您注销并再次登录才能使更改生效。自 OS X 10.8 起不再支持此文件。
  • 您用户的 launchd 实例:这适用于用户、GUI 和 CLI 启动的所有程序。您可以随时使用 launchctl 中的 setenv 命令应用更改。 理论上,您应该能够将 setenv 命令放入 ~/.launchd.conf 中,并且 launchd 会当用户登录时自动读取它们,但实际上从未实现对此文件的支持。相反,您可以使用另一种机制在登录时执行脚本,并让该脚本调用 launchctl 来设置 launchd 环境。
  • /etc/launchd.conf:当系统启动和用户登录时,launchd 会读取该文件。它们会影响系统上的每个进程,因为 launchd 是根进程。要将更改应用于正在运行的 root launchd,您可以将命令通过管道传输到 sudo launchctl

需要理解的基本内容是:

  • 环境变量由进程的子进程在 fork 时继承。
  • 根进程是一个 launchd 实例,每个用户 session 还有一个单独的 launchd 实例。
  • launchd 允许您使用 launchctl 更改其当前环境变量;然后,更新后的变量将被它派生的所有新进程继承。

使用 launchd 设置环境变量的示例:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

现在,启动使用该变量的 GUI 应用程序,瞧!

要解决 ~/.launchd.conf 不起作用的问题,您可以将以下脚本放入 ~/Library/LaunchAgents/local.launchd.conf.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl &lt; ~/.launchd.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

然后你可以将setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE放入~/.launchd.conf中,每次登录时都会执行它。

请注意,当以这种方式将命令列表传递到 launchctl 时,您将无法使用包含空格的值设置环境变量。如果需要这样做,可以按如下方式调用 launchctl:launchctl setenv MYVARIABLE "QUOTE THE STRING"

另请注意,在登录时运行的其他程序可能会在启动代理之前执行,因此可能看不到它设置的环境变量。

关于macos - Mac OS X 中的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/603785/

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