Esegui script bash all'accesso memorizzato nella cartella Inizio?

17

Quando provo a caricare un plist LaunchAgent da launchctl non riesco a scoprire come eseguire uno script nella directory home.

Il mio codice è:

<?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>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>~/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

Ho provato sia con che senza bash e anche sostituendo ~ con $HOME . Ho anche provato a usare bash -c senza che funzioni.

Il codice di errore è:

'com.tyilo.test: bash: ~/script.sh: No such file or directory'
    
posta Tyilo 13.01.2012 - 00:54
fonte

6 risposte

13

EnableGlobbing consente l'espansione di tilde e caratteri jolly per ProgramArguments :

<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
    <string>say</string>
    <string>~/*</string>
</array>

Non influenza Program o WatchPaths , tuttavia l'espansione tilde funziona in WatchPaths per impostazione predefinita.

    
risposta data 08.03.2013 - 02:09
fonte
16

EnableGlobbing non funziona su OS X Yosemite 10.10. È stato deprecato ( ref ).

Puoi vedere nei registri The EnableGlobbing key is no longer respected. Please remove it. (da /var/log/system.log )

Il problema è che launchd cwd (directory di lavoro corrente) è / , quindi non puoi usare ./ come qualcuno ha detto.

Per eseguire uno script da casa tua il modo semplice è usare (bash|zsh|sh) -c . opzione. In questo modo avrai la possibilità di utilizzare la tilde ~ o la variabile $HOME .

<?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>org.your.stuff</string>
    <key>ProgramArguments</key>
    <array>
      <!-- here is the important thing -->
      <string>zsh</string>
      <string>-c</string>
      <string>~/you/script/in/your/home</string>
    </array>

    <!-- code below is just for the example -->
    <!-- Keep running... -->
    <key>KeepAlive</key>
    <true />
    <!-- ...every day. In sec, 60*60*24 = every day -->
    <key>ThrottleInterval</key>
    <integer>86400</integer>
  </dict>
</plist>
    
risposta data 27.10.2014 - 09:28
fonte
8

Il più affidabile che ho trovato è stato utilizzando sh e la variabile di ambiente HOME :

<?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>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>"$HOME/script.sh"</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

Nota: le virgolette sono obbligatorie.

    
risposta data 07.03.2013 - 21:17
fonte
2

Sarebbe utile sapere perché lo script deve essere eseguito dalla home directory dell'utente. Se hai bisogno del nome utente per lo script, puoi ottenerlo assegnandolo a una variabile come in

user='whoami'

Quindi usa $user nello script.

In realtà metterei lo script in una posizione diversa da una home directory, quindi è accessibile da altri utenti sullo stesso computer. Puoi usare la directory condivisa o mettere lo script in / Library / Scripts /

Dovrai utilizzare il percorso completo per il launchd plist. Inoltre, nel tuo launchd plist non dovrai specificare <string>bash</string> come dovresti avere lo shebang nello script e dovrebbe essere eseguibile.

    
risposta data 13.01.2012 - 04:11
fonte
1

Se il tuo script è un agente utente (e quindi si trova nella libreria della cartella Home), la directory di lavoro corrente di launchd è la cartella Home. UNIX si riferisce alla directory home con un punto nel percorso.

Quindi, in pratica, usa ./script.sh invece di ~/script.sh . ; -)

    
risposta data 18.01.2013 - 16:23
fonte
0

È eseguibile?

chmod 700 ~/script.sh

nel Terminale. Inoltre, non utilizzerei $ HOME o ~, ma il percorso effettivo del file.

<?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>com.tyilo.test</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
    
risposta data 13.01.2012 - 18:10
fonte

Leggi altre domande sui tag