通过launchd.conf设置环境变量不再适用于OS X Yosemite / El Capitan / macOS Sierra / Mojave?

时间:2014-08-19 14:24:36

标签: environment-variables osx-yosemite osx-elcapitan

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

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

9 个答案:

答案 0 :(得分:150)

使用以下内容在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

<强> [编辑]

在某些情况下,这并不是很有效。如果重新启动计算机并且在重新登录&#34;重新打开窗口。如果选中,重新打开的窗口可能看不到变量(也许它们在代理程序运行之前打开)。此外,如果您通过ssh登录,则不会设置变量(因此您需要在〜/ .bash_profile中设置它们)。最后,这似乎不适用于El Capitan和Sierra的PATH。这需要通过&quot; launchctl配置用户路径设置...&#39;在/ etc / paths。

答案 1 :(得分:63)

[原始回答]:您仍然可以使用launchctl setenv variablename value设置变量,以便所有应用程序(通过Dock启动的图形应用程序)选择或Spotlight,除了通过终端启动的那些)。

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

[修改]:要避免这种情况,请启动AppleScript Editor,输入如下命令:

do shell script "launchctl setenv variablename value"

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

现在将( + s)保存为文件格式:应用。最后打开System Settings用户&amp;论坛登录项并添加新的应用程序。

[原始回答]:要在这个地方解决您希望在短shell脚本中定义的所有变量,然后查看此previous answer about how to run a script on MacOS login。这样,当用户登录时,将调用脚本。

[编辑]:这两个解决方案都不是完美的,因为变量只会为特定的用户设置,但我希望/猜测这可能就是您所需要的。< / p>

如果您有多个用户,则可以为每个用户手动设置登录项,也可以在每个用户中放置 com.user.loginscript.plist 的副本。他们的本地 Library / LaunchAgents 目录,指向相同的shell脚本。

当然,这些变通办法都不像 /etc/launchd.conf 那样方便。

[进一步修改]:下面的用户提到这对他不起作用。不过我已经在多台Yosemite机器上进行了测试,它对我有用。如果您遇到问题,请记住您需要重新启动应用程序才能生效。此外,如果您通过〜/ .profile 〜/ .bash_profile 在终端中设置变量,它们将覆盖通过 launchctl setenv 设置的内容< strong>应用程序从shell开始。

答案 2 :(得分:21)

可以在Mac OS X 10.10 Yosemite上设置环境变量,包含3个文件+ 2个命令。

包含环境变量定义的主文件:

$ 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>

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

$ 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 / environment文件后立即自动更新环境变量 - 只需重新启动应用程序
  3. 问题/问题:

    为了使您的env变量在应用程序系统重启后正确使用,您将需要:

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

    这是因为Apple拒绝加载服务的显式排序,因此env变量与“重新打开队列”的处理并行注册。

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

答案 3 :(得分:6)

引自

Apple Developer Relations 10-Oct-2014 09:12 PM

  

经过深思熟虑后,工程部门已删除此功能。   出于安全原因,故意删除了文件/etc/launchd.conf。   作为一种解决方法,您可以在启动期间以root身份运行launchctl limit,可能来自LaunchDaemon。 (...)

解决方案:

  

通过bash-script将代码放入/Library/LaunchDaemons/com.apple.launchd.limit.plist

#!/bin/bash

echo '<?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>eicar</string>
        <key>ProgramArguments</key>
        <array>
                <string>/bin/launchctl</string>
                <string>limit</string>
                <string>core</string>
                <string>unlimited</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>ServiceIPC</key>
        <false/>
</dict>
</plist>' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist

答案 4 :(得分:3)

以下是恢复旧行为的命令:

# create a script that calls launchctl iterating through /etc/launchd.conf
echo '#!/bin/sh

while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf;
' > /usr/local/bin/launchd.conf.sh

# make it executable
chmod +x /usr/local/bin/launchd.conf.sh

# launch the script at startup
echo '<?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>launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>/usr/local/bin/launchd.conf.sh</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist

现在,您可以在setenv JAVA_HOME /Library/Java/Home中指定/etc/launchd.conf等命令。

检查El Capitan。

答案 5 :(得分:2)

对我有用的东西(灵感来自aax'谢谢):

将其粘贴到 /Library/LaunchDaemons/com.apple.launchd.limit.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>eicar</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/launchctl</string>
    <string>limit</string>
    <string>maxfiles</string>
    <string>16384</string>
    <string>16384</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>ServiceIPC</key>
  <false/>
</dict>
</plist>

如果您需要一步一步:

  • 启动终端
  • 键入 sudo su ,然后输入您的密码以root身份登录
  • 输入 vi /Library/LaunchDaemons/com.apple.launchd.limit.plist
  • 进入vi编辑器时,按 i 键进入插入模式,然后粘贴上面的确切代码内容(⌘+v)。这将强制限制每个进程16384个文件和16384个文件
  • 保存文件并使用esc然后:wq
  • 退出
  • 重新启动系统,并使用命令 launchctl limit
  • 检查系统是否正常工作

我希望这对你有所帮助。

答案 6 :(得分:2)

您可以尝试https://github.com/ersiner/osx-env-sync。它从单一来源处理命令行和GUI应用程序,并使用最新版本的OS X (Yosemite)。

您可以使用路径替换和其他shell技巧,因为您编写的是由bash首先提供的常规bash脚本。没有限制..(查看osx-env-sync文档,您将了解它是如何实现的。)

我回答了类似的问题here,您可以在其中找到更多信息。

答案 7 :(得分:-3)

解决方案是将您的变量添加到/etc/profile。一切都按预期工作! 当然你必须以root用户身份使用sudo nano / etc / profile。如果您使用任何其他方式编辑它,系统将使用损坏的/ etc / profile进行投诉,即使您将权限更改为root也是如此。

答案 8 :(得分:-5)

我以下列方式在〜/ .bash_profile中添加了变量。完成后重启/注销并登录

export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3
export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4
launchctl setenv M2_HOME $M2_HOME
launchctl setenv ANT_HOME $ANT_HOME
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin
launchctl setenv PATH $PATH

注意:无需重启/注销并登录,您可以使用;

应用这些更改
source ~/.bash_profile