[英]Environment variables in Mac OS X
更新:下面的链接没有完整的答案。 必须在两个地方(一个用于 GUI,一个用于 shell)设置路径或变量是很蹩脚的。
不重复: 在 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
:登录时由 loginwindow 读取。 它适用于所有应用程序,包括 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
到sudo launchctl
。要理解的基本内容是:
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 < ~/.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"
。
另请注意,登录时运行的其他程序可能会在启动代理之前执行,因此可能看不到它设置的环境变量。
没有必要重复。 您可以使用launchctl setenv
设置由 launchd(和子进程,即您从 Spotlight 启动的任何程序)使用的环境变量。
例如,如果您想在.bashrc
或其他任何地方设置后在 launchd 中镜像当前路径:
PATH=whatever:you:want
launchctl setenv PATH $PATH
环境变量不会在运行的应用程序中自动更新。 您将需要重新启动应用程序以获取更新的环境变量(尽管您可以只在 shell 中设置变量,例如PATH=whatever:you:want
;无需重新启动终端)。
您可以在 linux 上阅读,这与 Mac OS X 非常接近。 或者你可以在 BSD Unix 上阅读,它更接近一些。 在大多数情况下,Linux 和 BSD 之间的差异并不大。
/etc/profile
是系统环境变量。
~/.profile
是用户特定的环境变量。
“我应该在哪里设置我的 JAVA_HOME 变量?”
/etc/profile
弄乱其他用户吗?通常,即使我是唯一的用户,我也不想弄乱系统范围的设置。 我更喜欢编辑我的本地设置。
对于 GUI 应用程序,您必须创建和编辑~/.MacOSX/environment.plist
。 更多细节在这里。 您需要注销才能使这些生效。 我不确定它们是否也会影响从终端启动的应用程序,但我认为它们会。
对于从终端启动的应用程序,您还可以编辑 ~/.profile 文件。
只需打开~/.profile
文件,通过终端中的nano
在那里输入:
export PATH=whatever/you/want:$PATH
保存此文件(cmd+X 和 Y)。 之后,请再次注销/登录或在终端中打开一个新选项卡并尝试使用您的新变量。
请不要忘记在任何/您/想要的之后添加 ":$PATH",否则您将删除 PATH 变量中的所有路径,这些路径在此之前存在。
使用osx-env-sync从单一来源同步命令行和 GUI 应用程序的 OS X 环境变量。
我还张贴回答一个相关的问题在这里。
我编写了一个工具来轻松管理 macOS 应用程序的环境变量。
https://github.com/yuezk/macenv
您可以使用~/.macenv set
环境变量,例如:
~/.macenv set JAVA_HOME /path/to/java/home
在launchctl setenv
,它调用launchctl setenv
来设置环境变量,同时将环境变量保存到~/.launchd.conf
中,并注册一个自动启动服务来在操作系统重启时加载环境变量。
如果要在 macOS 上永久更改环境变量,请在/etc/paths
设置它们。 请注意,默认情况下此文件是只读的,因此您必须chmod才能获得写入权限。
对于 2020 Mac OS X Catalina 用户:
忘记其他无用的答案,这里只需要两个步骤:
使用命名约定创建一个文件:priority-appname。 然后将要添加的路径复制粘贴到PATH
。
例如80-vscode
与内容/Applications/Visual Studio Code.app/Contents/Resources/app/bin/
在我的情况下。
将该文件移动到/etc/paths.d/
。 不要忘记在终端中打开一个新选项卡(新会话)并输入echo $PATH
以检查您的路径是否已添加!
注意:此方法仅将您的路径附加到PATH
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.