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

21

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

Ответы:

16

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

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

Джо Блок
источник
3
Конечно, вы можете жестко закодировать свой env. переменные в списке, но вы не можете использовать существующие переменные, такие как $ HOME. Если только это не аргумент скрипта оболочки, в этом случае оболочка (не launchd) расширит его. Но в этом примере это может сработать, если вы добавите -cпараметр в / bin / sh?
Mivk
3

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

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

voretaq7
источник
1

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

So: <string>~/bin/attach-devroot.sh</string>
Дейв Холланд
источник
1
Это не работает Я получаю"/bin/sh: ~/bin/attach-devroot.sh: No such file or directory"
Matpie
Это работает, только если EnableGlobbingфлаг установлен в true. Смотрите справочную страницу launchd.plist .
Сакра
2
EnableGlobbingбольше не поддерживается
Ливиу