Setting environment variables via launchd.conf no longer works in OS X Yosemite/El Capitan/macOS Sierra/Mojave?

前端 未结 9 1220
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-22 08:07

It looks like the launchd.conf does not load my environment variable anymore. Has anyone else noticed that?

Is there another solution to permanently set

相关标签:
9条回答
  • 2020-11-22 08:40

    Create an environment.plist file in ~/Library/LaunchAgents/ with this content:

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

    You can add many launchctl commands inside the <string></string> block.

    The plist will activate after system reboot. You can also use launchctl load ~/Library/LaunchAgents/environment.plist to launch it immediately.

    [Edit]

    The same solution works in El Capitan too.

    Xcode 7.0+ doesn't evaluate environment variables by default. The old behaviour can be enabled with this command:

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

    [Edit]

    There a couple of situations where this doesn't quite work. If the computer is restarted and "Reopen windows when logging back in" is selected, the reopened windows may not see the variables (Perhaps they are opened before the agent is run). Also, if you log in via ssh, the variables will not be set (so you'll need to set them in ~/.bash_profile). Finally, this doesn't seem to work for PATH on El Capitan and Sierra. That needs to be set via 'launchctl config user path ...' and in /etc/paths.

    0 讨论(0)
  • 2020-11-22 08:41

    Here are the commands to restore the old behavior:

    # 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
    

    Now you can specify commands like setenv JAVA_HOME /Library/Java/Home in /etc/launchd.conf.

    Checked on El Capitan.

    0 讨论(0)
  • 2020-11-22 08:41

    The solution is to add your variable to /etc/profile. Then everything works as expected! Of course you MUST do it as a root user with sudo nano /etc/profile. If you edit it with any other way the system will complain with a damaged /etc/profile, even if you change the permissions to root.

    0 讨论(0)
提交回复
热议问题