¿Ejecutar el script bash en el inicio de sesión almacenado en la carpeta de inicio?

17

Cuando intento cargar una lista de LaunchAgent desde launchctl , no puedo encontrar una forma de ejecutar un script en el directorio de inicio.

Mi código es:

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

He intentado con y sin bash y también he reemplazado ~ con $HOME . También he intentado usar bash -c sin que funcione.

El código de error es:

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

6 respuestas

13

EnableGlobbing habilita la expansión de tilde y comodín para ProgramArguments :

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

No afecta a Program o WatchPaths , sin embargo, la expansión de tilde funciona en WatchPaths de forma predeterminada.

    
respondido por el user495470 08.03.2013 - 02:09
16

EnableGlobbing no funciona en OS X Yosemite 10.10. Ha sido desaprobado ( ref ).

Puedes ver en los registros The EnableGlobbing key is no longer respected. Please remove it. (de /var/log/system.log )

El problema es que launchd cwd (directorio de trabajo actual) es / , por lo que no puede usar ./ como dicen algunas personas.

Para ejecutar un script desde su casa, la forma más simple es usar (bash|zsh|sh) -c . opción. De esta manera, podrá utilizar la tilde ~ o la variable $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>
    
respondido por el MoOx 27.10.2014 - 09:28
8

Lo más confiable que encontré al hacer esto fue usar sh y la variable de entorno 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: las comillas son obligatorias.

    
respondido por el Tyilo 07.03.2013 - 21:17
2

Sería útil saber por qué el script debe ejecutarse desde el directorio de inicio del usuario. Si necesita el nombre corto del usuario para el script, puede obtenerlo asignándolo a una variable como en

user='whoami'

Luego use $user en el script.

Realmente pondría la secuencia de comandos en un lugar que no sea un directorio principal, entonces otros usuarios pueden acceder a la misma computadora. Podría usar el directorio compartido o poner el script en / Library / Scripts /

Tendrá que usar la ruta completa para el lanzamientod plist. Además, en tu lista de lanzamiento no necesitarás especificar <string>bash</string> ya que deberías tener el shebang en el script y debería ser ejecutable.

    
respondido por el afragen 13.01.2012 - 04:11
1

Si su script es un agente de usuario (y, por lo tanto, se encuentra en la biblioteca de la carpeta de Inicio), el directorio de trabajo actual de launchd es la carpeta de Inicio. UNIX se refiere al directorio de inicio con un punto en la ruta.

Básicamente, use ./script.sh en lugar de ~/script.sh . ;-)

    
respondido por el Randy Marsh 18.01.2013 - 16:23
0

¿Es ejecutable?

chmod 700 ~/script.sh

en la Terminal. Además, no usaría $ HOME o ~ sino la ruta real al archivo.

<?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>
    
respondido por el TJ Luoma 13.01.2012 - 18:10

Lea otras preguntas en las etiquetas