Use an environment variable in a launchd script
Solution 1:
Not in the ProgramArguments key. You need to add an EnvironmentVariables
key into your plist's dict like so:
<?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>EnvironmentVariables</key>
<dict>
<key>AN_ENVIRONMENT_VARIABLE_NAME</key>
<string>the_value</string>
</dict>
<key>Label</key>
<string>me.mpietz.MountDevRoot</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>$HOME/bin/attach-devroot.sh</string>
<!-- Instead of using...
<string>/Users/mpietz/bin/attach-devroot.sh</string -->
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
See: Creating Launch Daemons and Agents.
Solution 2:
The best way to handle this is by wrapping your command in a shell. For example:
<?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>KeepAlive</key>
<false/>
<key>Label</key>
<string>sh.daniel.envvar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>-c</string>
<string>echo 'You did the thing!' > $HOME/did-the-thing.log</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
❯ cat ~/did-the-thing.log
You did the thing!
The flag -c
tells ZSH (and Bash, and sh) to run the command specified in your next. If you add the flag -l
, it’ll load your dotfiles before executing, just as a normal login shell does.
Solution 3:
I don't think launchd knows about the environment natively, at least not as ${VARIABLE} substitutions.
There's nothing stopping you from launching a shell script (or a shell with -c
) as your launchd action though, and that would have an environment and respect ${VARIABLES} -- Be aware of the difference between System and User daemons/agents in that case though...
Solution 4:
I'm not sure - I haven't tried it before... but I can tell you that if the only variable you care about is home - you can use ~.
So: <string>~/bin/attach-devroot.sh</string>