0 votos

¿Es posible evaluar una expresión en la matriz ProgramArguments de launchd?

¿Es posible componer mi launchd.plist para que una expresión incrustada sea evaluada y no tratada como un valor literal? Y, si es así, ¿cómo?

Tengo un ~/Library/LaunchAgents/setenv.JAVA_HOME.plist que contiene un /bin/launchctl llamar de la siguiente manera:

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

El problema es que el $(/usr/libexec/java_home -v1.8) no se evalúa y en su lugar la expresión JAVA_HOME a la variable de entorno se le asigna el valor literal $(/usr/libexec/java_home -v1.8) .

Hice esta pregunta en Stack Overflow la semana pasada pero han tenido tan pocas visitas que supongo que ese no es el lugar para ello.

1voto

Adil Hussain Puntos 106

Tengo una respuesta en la pregunta original de Stack Overflow, ¿Es posible evaluar una expresión en la matriz ProgramArguments de launchd?

Es posible mediante este comando bash:

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

El archivo plist que quieres es el siguiente:

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

0voto

klanomath Puntos 19587

Aunque esto es más adecuado como comentario, es demasiado largo, así que lo he convertido en una respuesta:

Especificaciones:

  • OS X 10.10.5
  • JDKs 1.8.0_72 y 1.7.0_80 instalada (para pruebas)

Uso de dos listas diferentes test.so.global instalado en /Library/LaunchDaemons con el contenido:

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

y test.so.user instalado en ~/Library/LaunchAgents con el contenido:

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

y ambos cargados obtengo los siguientes resultados:

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

Sólo carga test.so.global rendimientos:

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

Sólo carga test.so.user rendimientos:

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

Así que dependiendo de cómo/donde quieras establecer JAVA_HOME usa ambos o uno de los dos plists.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X