setenv variable with spaces in launchd.conf?

2019-02-09 03:10发布

问题:

I'm a Linux user that just recently got a mac. I'm trying to set up my IDE and found out that Macs don't use .bashrc / .bash_profile / etc. for GUI apps. So, if you have a GUI app that needs an environment variable, you're apparently supposed to do it in /etc/launchd.conf

The thing is, this file uses csh style setenv syntax ("setenv key value" instead of "export key='value'") so now that I have a variable that has a space in it, I don't know what to do. Nothing is working. This is what I've tried to test it:

setenv MAVEN_OPTS "-Xms512m -Xmx1024m"
setenv MAVEN_OPTS1 '-Xms512m -Xmx1024m'
setenv MAVEN_OPTS2 (-Xms512m -Xmx1024m)
setenv MAVEN_OPTS3=(-Xms512m -Xmx1024m)
setenv MAVEN_OPTS4 -Xms512m -Xmx1024m
setenv MAVEN_OPTS5 -Xms512m
setenv MAVEN_OPTS6 "$MAVEN_OPTS5 -Xmx1024"
setenv MAVEN_OPTS7 $MAVEN_OPTS5 -Xmx1024
setenv MAVEN_OPTS8 /just/checking
setenv MAVEN_OPTS9="-Xms512m -Xmx1024m"
setenv MAVEN_OPTS10='-Xms512m -Xmx1024m'
setenv MAVEN_OPTS11='-Xms512m\ -Xmx1024m'
setenv MAVEN_OPTS12 '-Xms512m\ -Xmx1024m'
setenv MAVEN_OPTS13 "-Xms512m\ -Xmx1024m"
setenv MAVEN_OPTS14 -Xms512m\ -Xmx1024m

After a reboot only var #5 and #8 survive. (The ones with no spaces.) None of the rest are in my environment.

回答1:

Try using launchd instead (create plist /Library/LaunchDaemons/java.props.plist):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>java.props</string>
    <key>ProgramArguments</key>
    <array>
        <string>launchctl</string>
        <string>setenv</string>
        <string>JAVA_OPTS</string>
        <string>-Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>LaunchOnlyOnce</key>
    <true/>
</dict>
</plist>

This will run once and set your environment up. Hope it'll help.



回答2:

It does not work as in a c-shell because /etc/launchd.conf is nothing but a sequence of special commands for launchctl. See the launchctl man page for a reference on what works in /etc/launchd.conf

Sadly, this still won't help you to solve this problem, but I hope it will clarify the context a little. To me this problem is a shortcoming in Apple's launchctl/launchd tools. I have a hard time working around it myself.



回答3:

On 10.8.2 the following command works fine:

$ launchctl setenv MY_VARIABLE My\ value\ with\ spaces

Verify with:

$ launchctl getenv MY_VARIABLE
My value with spaces


回答4:

Add the following line to /etc/launchd.conf (create if it doesn't exist)

setenv MY_VARIABLE My\ value\ with\ spaces

Note that this will only have an effect after rebooting.

To use the new value without having to reboot, additionally run the command in the terminal

launchctl setenv MY_VARIABLE My\ value\ with\ spaces
as patrikha suggested.

Note that this will only have an effect for applications started after running the command. Manipulating /etc/launchd.conf is still necessary to keep the change after rebooting.



回答5:

In 10.13.2, this works for me:

launchctl setenv MY_VARIABLE 'My value with spaces'

But to be specific, I'm using Script Editor to create an app (~/StartupEnvVars.app) containing lines like this:

do shell script "launchctl setenv MY_VARIABLE 'My value with spaces'"

Then, in Settings|Users|Login Items I add this app as a startup item.

It works, with this caveat: if I have Terminal and my R app running when I log out, and choose to reopen windows on logging back in, after those apps auto load when I log in, they DO NOT see the environment variables set by StartupEnvVars.app. But, if I close those apps and reopen them, then they see the environment variables.

If it were Terminal only, I'd use .bash_profile, but I want to set env vars for use in R also. I think there have been about 5 ways to set global env vars in OSX since I started using it. Each major new version has a new way of doing it. Annoying.



标签: macos launchd