Ist es möglich, einen Ausdruck im Array ProgramArguments von launchd auszuwerten?


0

Ist es möglich, meine zu komponieren? launchd.plist Datei, damit ein eingebetteter Ausdruck ausgewertet und nicht als Literalwert behandelt wird? Und wenn ja, wie?

Ich habe ein ~/Library/LaunchAgents/setenv.JAVA_HOME.plist Datei, die a enthält /bin/launchctl wie folgt anrufen:

<?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>setenv.JAVA_HOME</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/launchctl</string>
        <string>setenv</string>
        <string>JAVA_HOME</string>
        <string>$(/usr/libexec/java_home -v1.8)</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
</dict>
</plist>

Das Problem ist, die $(/usr/libexec/java_home -v1.8) Ausdruck wird nicht ausgewertet und stattdessen die JAVA_HOME Umgebungsvariable wird der Literalwert zugewiesen $(/usr/libexec/java_home -v1.8).

Ich habe diese Frage in gestellt Paketüberfluss letzte woche hatte aber so wenige ansichten ich vermute das das nicht der ort dafür ist.


1
Sie versuchen also im Wesentlichen, einen Weg zu finden, um eine globale Umgebungsvariable festzulegen, nein? apple.stackexchange.com/questions/107787 und apple.stackexchange.com/questions/64916
bmike

Antworten:


1

Ich habe eine Antwort auf die ursprüngliche Frage zum Stapelüberlauf erhalten. Ist es möglich, einen Ausdruck im Array ProgramArguments von launchd auszuwerten?

Mit diesem Bash-Befehl ist Folgendes möglich:

/bin/bash -c '/bin/launchctl setenv JAVA_HOME $(/usr/libexec/java_home -v1.8)'

Die gewünschte plist-Datei lautet wie folgt:

<?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>test.so</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>/bin/launchctl setenv JAVA_HOME $(/usr/libexec/java_home -v1.8)</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
</dict>
</plist>

1
das funktioniert bei mir nicht
klanomath

klanomath, was ist der wert der JAVA_HOME Umgebungsvariable auf Ihrem Computer nach dem Laden der oben genannten Datei bei der Anmeldung? Das heißt, was wird in Terminal gedruckt, wenn Sie diesen Befehl ausführen: launchctl getenv JAVA_HOME?
Adil Hussain

0

Obwohl dies als Kommentar besser geeignet ist, ist es viel zu lang, so dass ich es zu einer Antwort gemacht habe:

Technische Daten:

  • OS X 10.10.5
  • JDK 1.8.0_72 und 1.7.0_80 installiert (zu Testzwecken)

Mit zwei verschiedenen Plisten test.so.global installiert in / Library / LaunchDaemons mit dem Inhalt:

<?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>test.so.global</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>/bin/launchctl setenv JAVA_HOME $(/usr/libexec/java_home -v 1.7)</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

und test.so.user installiert in ~ / Library / LaunchAgents mit dem Inhalt:

<?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>test.so.user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>/bin/launchctl setenv JAVA_HOME $(/usr/libexec/java_home -v 1.8)</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

und beide geladen bekomme ich folgende ergebnisse:

host:~ user$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_72.jdk/Contents/Home
host:~ user$ launchctl getenv JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_72.jdk/Contents/Home
host:~ user$ sudo launchctl getenv JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home

Wird nur geladen test.so.global ergibt:

host:~ user$ echo $JAVA_HOME
    #empty line
host:~ user$ launchctl getenv JAVA_HOME
host:~ user$ sudo launchctl getenv JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home

Wird nur geladen test.so.user ergibt:

host:~ user$ echo $JAVA_HOME
    #empty line
host:~ user$ launchctl getenv JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_72.jdk/Contents/Home
host:~ user$ sudo launchctl getenv JAVA_HOME

Verwenden Sie also je nachdem, wie / wo Sie JAVA_HOME einstellen möchten, entweder beide oder eine der beiden Plisten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.