Используйте переменную окружения в скрипте launchd

Мне интересно, можно ли указать переменную envrionment в ProgramArguments часть скрипта luanchd на 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>

3 ответа

Не в ключе 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>

См.: Создание демонов запуска и агентов.

Лучший способ справиться с этим - заключить команду в оболочку. Например:

<?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, он загрузит ваши точечные файлы перед выполнением, как это делает обычная оболочка входа.

Я не думаю, что launchd знает об окружающей среде изначально, по крайней мере, не как ${VARIABLE} замены.

Ничто не мешает вам запустить скрипт оболочки (или оболочку с -c) в качестве запускаемого вами действия, хотя это будет иметь среду и уважать ${VARIABLES} - хотя в этом случае следует помнить о разнице между системными и пользовательскими демонами / агентами...

Я не уверен - я не пробовал это раньше... но я могу сказать вам, что если единственная переменная, которая вас волнует, это home - вы можете использовать ~.

So: <string>~/bin/attach-devroot.sh</string>
Другие вопросы по тегам