Мне любопытно, можно ли указать переменную среды в ProgramArguments
часть сценария launchd в Mac OS X Leopard.
<?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>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>
Не в ключе ProgramArguments. Вам нужно добавить EnvironmentVariables
введите ключ в свой список 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>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>
Видеть: Создание демонов запуска и агентов.
Я не думаю, что launchd изначально знает об окружении, по крайней мере, о подстановках $ {VARIABLE}.
Ничто не мешает вам запустить сценарий оболочки (или оболочку с -c
) как ваше действие при запуске, и это будет иметь среду и уважать $ {VARIABLES}. Однако имейте в виду разницу между системными и пользовательскими демонами / агентами в этом случае ...
Лучший способ справиться с этим - заключить команду в оболочку. Например:
<?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!
Флаг -c
сообщает ZSH (и Bash, и sh) выполнить команду, указанную в вашем next. Если добавить флаг -l
, он загрузит ваши точечные файлы перед выполнением, как это делает обычная оболочка входа.
Я не уверен - я не пробовал раньше ... но могу сказать вам, что если единственная переменная, которая вас волнует, это home, вы можете использовать ~.
So: <string>~/bin/attach-devroot.sh</string>