Verwenden Sie eine Umgebungsvariable in einem launchd-Skript

21

Ich bin gespannt, ob es möglich ist, eine Umgebungsvariable im ProgramArgumentsTeil eines Luanchd-Skripts unter Mac OS X Leopard anzugeben .

<?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
quelle

Antworten:

16

Nicht im Schlüssel ProgramArguments. Sie müssen einen EnvironmentVariablesSchlüssel wie folgt in das Diktat Ihrer Pliste einfügen:

<?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>

Siehe: Erstellen von Start-Daemons und Agenten .

Joe Block
quelle
3
Sicher, Sie können Ihre Umgebung hart codieren. Sie können jedoch keine vorhandenen Variablen wie $ HOME verwenden. Es sei denn, es ist nur ein Argument für ein Shell-Skript. In diesem Fall wird es von der Shell (nicht von launchd) erweitert. Aber in diesem Beispiel könnte es tatsächlich funktionieren, wenn Sie die -cOption zu / bin / sh? Hinzufügen .
Mivk
3

Ich glaube nicht, dass launchd die Umgebung von Haus aus kennt, zumindest nicht als $ {VARIABLE} -Ersetzung.

Es hält Sie jedoch nichts davon ab, ein Shell-Skript (oder eine Shell mit -c) als Ihre launchd-Aktion zu starten. Dies hätte eine Umgebung und würde $ {VARIABLES} respektieren. Beachten Sie in diesem Fall den Unterschied zwischen System- und Benutzerdämonen / -agenten obwohl...

voretaq7
quelle
1

Ich bin mir nicht sicher - ich habe es noch nie versucht ... aber ich kann Ihnen sagen, dass Sie ~ verwenden können, wenn die einzige Variable, die Sie interessiert, home ist.

So: <string>~/bin/attach-devroot.sh</string>
Dave Holland
quelle
1
Das geht nicht. Ich bekomme"/bin/sh: ~/bin/attach-devroot.sh: No such file or directory"
Matpie
Dies funktioniert nur, wenn das EnableGlobbingFlag auf true gesetzt ist. Siehe die Manpage launchd.plist .
Sakra
2
EnableGlobbingnicht mehr unterstützt
Liviu