È possibile valutare un'espressione nell'array ProgramArguments di launchd?

0

È possibile comporre il mio launchd.plist file in modo che un'espressione incorporata venga valutata e non trattata come valore letterale? E, in caso affermativo, come?

Ho un file ~/Library/LaunchAgents/setenv.JAVA_HOME.plist che contiene una chiamata /bin/launchctl come segue:

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

Il problema è che l'espressione $(/usr/libexec/java_home -v1.8) non viene valutata e invece la variabile di ambiente JAVA_HOME è assegnata al valore letterale $(/usr/libexec/java_home -v1.8) .

Ho posto questa domanda in Overflow dello stack la scorsa settimana, ma ho avuto così pochi punti di vista che immagino che non sia questo il posto per esso.

    
posta Adil Hussain 01.02.2016 - 18:38
fonte

2 risposte

1

Hai una risposta nella domanda di Overflow dello stack originale, È possibile valutare un'espressione nell'array ProgramArguments di launchd?

È possibile tramite questo comando bash:

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

Il file plist che desideri è il seguente:

<?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>
    
risposta data 01.02.2016 - 19:35
fonte
0

Anche se questo è più adatto come commento, è molto lungo, quindi ho fatto una risposta:

Tutte le specifiche:

  • OS X 10.10.5
  • JDKs 1.8.0_72 e 1.7.0_80 installati (a scopo di test)

Utilizzando due diversi plists test.so.global installati in / Library / LaunchDaemons con il contenuto:

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

e test.so.user installati in ~ / Library / LaunchAgents con il contenuto:

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

ed entrambi caricati ottengo i seguenti risultati:

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

Restituisce solo test.so.global :

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

Solo il caricamento di test.so.user produce:

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

Quindi, in base a come / dove vuoi impostare JAVA_HOME, utilizza entrambi o uno dei due plists.

    
risposta data 02.02.2016 - 12:59
fonte

Leggi altre domande sui tag