为了账号安全,请及时绑定邮箱和手机立即绑定

通过Launchd.conf设置环境变量不再适用于OSX Yosemite/El Capitan

/ 猿问

通过Launchd.conf设置环境变量不再适用于OSX Yosemite/El Capitan

通过Launchd.conf设置环境变量不再适用于OSX Yosemite/El Capitan/MacOS塞拉利昂/Mojave?

看起来像是launchd.conf不再加载我的环境变量。还有人注意到吗?

是否有另一种永久设置环境变量的解决方案?


查看完整描述

3 回答

?
慕码人8056858

创建一个environment.plist文件在~/Library/LaunchAgents/有了这个内容:

<?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>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>
    launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
    launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
    launchctl setenv PATH $PATH:/Applications/gradle/bin
    </string>

  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

你可以添加很多launchctl控件内部的命令。<string></string>封锁。

这个plist将在系统重新启动后激活。您也可以使用launchctl load ~/Library/LaunchAgents/environment.plist立即发射。

[编辑]

同样的解决方案也适用于El Capitan。

默认情况下,Xcode 7.0+不计算环境变量。可以使用以下命令启用旧行为:

defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO

[编辑]

有几种情况下,这是不完全可行的。如果重新启动计算机并选择“重新登录时重新打开窗口”,则重新打开的窗口可能看不到变量(可能是在代理运行之前打开的)。另外,如果您通过ssh登录,则不会设置变量(因此需要在~/.bash_profile中设置它们)。最后,这似乎不适用于埃尔卡皮坦和塞拉的道路。这需要通过‘Launchctl配置用户路径.’来设置。以及在/etc/小径上。


查看完整回答
反对 回复 2019-07-11
?
繁星淼淼

[原始答案]:你还可以用launchctl setenv variablename value设置一个变量,以便由应用程序(通过Dock或Spotlight启动的图形应用程序,以及通过终端启动的应用程序)。

显然,您不会希望每次登录时都这样做。

[编辑]:为了避免这种情况,发射AppleScript Editor,输入如下命令:

do shell script "launchctl setenv variablename value"

(如果要设置多个变量,请使用多行)

现在保存(+s)文件格式:应用程序..终于打开System Settings → 用户和组 → 登录项并添加新的应用程序。

[原始答案]:要在这个地方工作-您希望在一个简短的shell脚本中定义的所有变量-然后看一看关于如何在MacOS登录上运行脚本的先前回答..这样,当用户登录时,脚本将被调用。

[编辑]:这两种解决方案都不是完美的,因为变量只会为此设置。专一用户,但我希望/猜测这可能是您所需要的。

如果确实有多个用户,则可以手动设置登录项或放置一份com.user.loginscript.plist在他们各自的地方图书馆/LaunchAgents目录,指向同一个shell脚本。

当然,这些解决办法都没有像现在这样方便。/etc/Launchd.conf.

[进一步编辑]:下面的一个用户提到这对他不起作用。然而,我已经在多台优胜美地机器上进行了测试,它确实对我有用。如果有问题,请记住,需要重新启动应用程序才能生效。此外,如果在终端中设置变量,则~/.剖面~/.bash剖面,他们将推翻通过Lachctl setenv从外壳启动的应用程序.


查看完整回答
反对 回复 2019-07-11
?
慕标琳琳

可以使用3个文件+2命令在MacOSX10.10Yosemite上设置环境变量。

具有环境变量定义的主文件:

$ ls -la /etc/environment 
-r-xr-xr-x  1 root  wheel  369 Oct 21 04:42 /etc/environment
$ cat /etc/environment
#!/bin/sh

set -e

syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start"

launchctl setenv JAVA_HOME      /usr/local/jdk1.7
launchctl setenv MAVEN_HOME     /opt/local/share/java/maven3

if [ -x /usr/libexec/path_helper ]; then
    export PATH=""
    eval `/usr/libexec/path_helper -s`
    launchctl setenv PATH $PATH
fi

osascript -e 'tell app "Dock" to quit'

syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete"

为用户应用程序(终端、IDE、.)加载环境变量的服务定义:

$ ls -la /Library/LaunchAgents/environment.user.plist
-rw-------  1 root  wheel  504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist
$ sudo cat /Library/LaunchAgents/environment.user.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>environment.user</string>
    <key>ProgramArguments</key>
    <array>
            <string>/etc/environment</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment</string>
    </array>
</dict>
</plist>

根用户应用程序的相同服务定义:

$ ls -la /Library/LaunchDaemons/environment.plist
-rw-------  1 root  wheel  499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist
$ sudo cat /Library/LaunchDaemons/environment.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>environment</string>
    <key>ProgramArguments</key>
    <array>
            <string>/etc/environment</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment</string>
    </array>
</dict>
</plist>

最后,我们应该注册这些服务:

$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist

我们得到的是:

  1. 声明系统环境变量的唯一位置:/etc/Environment
  2. 修改/etc/环境文件后立即自动更新环境变量-只需重新启动应用程序

问题/问题:

为了使您的env变量被应用程序正确地接受系统重启后你需要:

  • 要么登录两次:login=>logout=>login
  • 或者关闭&手动重新打开应用程序,其中应该使用env变量。
  • 或者不要使用“重新登录时重新打开窗口”功能。

这是因为Apple拒绝对已加载的服务进行显式排序,因此env变量与处理“重开队列”的过程并行进行。

但实际上,我每年只重新启动系统几次(在大更新时),所以这不是什么大事。


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 165 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信