Apakah mungkin untuk mengevaluasi ekspresi dalam larik ProgramArguments launchd?

0

Apakah mungkin untuk membuat launchd.plistfile saya sehingga ekspresi yang tertanam dievaluasi dan tidak diperlakukan sebagai nilai literal? Dan, jika ya, bagaimana?

Saya memiliki ~/Library/LaunchAgents/setenv.JAVA_HOME.plistfile yang berisi /bin/launchctlpanggilan sebagai berikut:

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

Masalahnya adalah, $(/usr/libexec/java_home -v1.8)ekspresi tidak dievaluasi dan sebagai gantinya JAVA_HOMEvariabel lingkungan ditugaskan nilai literal $(/usr/libexec/java_home -v1.8).

Saya menanyakan pertanyaan ini di Stack Overflow minggu lalu, tetapi hanya memiliki sedikit pandangan, saya kira itu bukan tempatnya.

Adil Hussain
sumber
1
Jadi, Anda pada dasarnya berusaha menemukan cara untuk menetapkan variabel lingkungan global, bukan? apple.stackexchange.com/questions/107787 dan apple.stackexchange.com/questions/64916
bmike

Jawaban:

1

Mendapat jawaban dalam pertanyaan Stack Overflow asli, Apakah mungkin untuk mengevaluasi ekspresi dalam array ProgramArguments launchd?

Mungkin dengan perintah bash ini:

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

File plist yang Anda inginkan adalah sebagai berikut:

<?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>
Adil Hussain
sumber
1
ini tidak berhasil untuk saya
klanomath
klanomath, apa nilai JAVA_HOMEvariabel lingkungan pada mesin Anda setelah file di atas dimuat saat login? yaitu apa yang akan dicetak di Terminal ketika Anda menjalankan perintah ini: launchctl getenv JAVA_HOME?
Adil Hussain
0

Meskipun ini lebih cocok sebagai komentar, itu terlalu lama jadi saya menjawabnya:

Spesifikasi:

  • OS X 10.10.5
  • JDK 1.8.0_72 dan 1.7.0_80 diinstal (untuk tujuan pengujian)

Menggunakan dua plists yang berbeda test.so.global diinstal ke / Library / LaunchDaemons dengan konten:

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

dan test.so.user diinstal ke ~ / Library / LaunchAgents dengan konten:

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

dan keduanya dimuat saya mendapatkan hasil berikut:

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

Hanya memuat hasil 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

Hanya memuat test.so.user yang menghasilkan:

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

Jadi tergantung pada bagaimana / di mana Anda ingin mengatur JAVA_HOME gunakan keduanya atau salah satu dari kedua plist.

klanomath
sumber