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


19

Cuando intento cargar un plist LaunchAgent desde launchctlno puedo encontrar cómo 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 reemplazando ~con $HOME. También he intentado usar bash -csin que funcione.

El código de error es:

`com.tyilo.test: bash: ~/script.sh: No such file or directory`

Intente poner la ruta completa, por ejemplo /Users/name/script.sh (También haría que el script sea ejecutable y con la primera línea #! / Bin / bash y lo ejecute directamente)
user151019

No puedo usar la ruta completa, ya que se usará en varias cuentas y computadoras.
Tyilo

1
Si se va a utilizar mis cuentas múltiples, debe ponerlo en / usr / local / bin / en lugar de hacer varias copias en $ HOME de cada usuario. Sería útil saber lo que está tratando de lograr con este script. Suena como un trabajo para un LoginHook, IMO.
TJ Luoma

Respuestas:


14

EnableGlobbingpermite la expansión de tilde y comodines para ProgramArguments:

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

No afecta Programo WatchPaths, sin embargo, la expansión de tilde funciona WatchPathsde manera predeterminada.


Esta es una forma mucho mejor de hacer esto. ¿Hay algún lugar donde pueda ver la documentación de las claves en un plist LaunchAgent?
Tyilo

hombre launchd.plist. O vea esta publicación de blog o mi sitio web .
Lri

1
Esto también me ayudó. Probado en las siguientes versiones de Mac OS X: 10.7, 10.8 y 10.9.
Dj S

66
Tenga en cuenta: esta función se ha eliminado en Yosemite ( Mac OS X 10.10+).
alex grey

Parece que tampoco está en 10.9.5
ocodo

18

EnableGlobbing no funciona en OS X Yosemite 10.10 . Ha quedado en desuso ( ref ).

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

El problema es que launchdcwd (directorio de trabajo actual) es /, por lo que no se puede usar ./como dijeron algunas personas.

Para ejecutar un script desde su casa, la forma más sencilla es utilizarlo (bash|zsh|sh) -c. opción. De esta manera, tendrá la capacidad de utilizar la tilde ~o la $HOMEvariable.

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

2
No creo que puedas usar tilde con sh; cuando Bash está involucrado como sh, se ejecuta en modo de compatibilidad POSIX, que deshabilita muchas extensiones de Bash.
tripleee

~/está engullendo, por lo que no es compatible. En su ./lugar, puede usar siempre que el demonio se guarde en la biblioteca de inicio de los usuarios. ( ~/Library/LaunchAgents)
Bruno

9

Lo más confiable que encontré al hacer esto fue mediante el uso shy la HOMEvariable de entorno:

<?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 cotizaciones son obligatorias.


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 úsalo $useren el guión.

Realmente pondría el script en otro lugar que no sea un directorio de inicio, luego otros usuarios pueden acceder a él en la misma computadora. Puede usar el directorio compartido o poner el script en / Library / Scripts /

Deberá utilizar la ruta completa para el pliegue launchd. Además, en su lista de lanzamiento no necesitará especificar, <string>bash</string>ya que debe tener el shebang en el script y debe ser ejecutable.


Especificar bashcomo el comando real para ejecutar es una buena alternativa sin perjuicio real. Si no tiene el shebang, u olvida hacer que el script sea ejecutable (o = rwx), bash seguirá invocando / ejecutando el script.
Jason Salaz el

1
Ya debería haber una variable para el nombre de usuario, como $ USER o $ LOGNAME. Además, la ubicación habitual para los scripts de Unix compartidos sería / usr / local / bin / (no es que no pueda colocarlos en otro lugar, pero / usr / local / bin / probablemente ya estará en su $ PATH).
TJ Luoma

Usar whoami es solo otro método para obtener la misma información que $ USER o $ LOGNAME. Sugerí las ubicaciones anteriores ya que no quería presumir nada del interrogador. Además, antes de intentar hacer que el pliegue launchd funcione, el script realmente necesita poder ejecutarse desde la CLI.
afragen el

1

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

¿Cuál es la razón del voto negativo?
TJ Luoma

1

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

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


3
No, el directorio de trabajo de launchd es en realidad /, no '~'.
Tyilo

@Tyilo No estoy seguro de lo que quieres decir. Si quiere decir "el directorio de trabajo de launchd es la raíz, en todos los casos, incluso en modo de usuario", proporcione una referencia. Si quiere decir "launchd usa una barra diagonal en lugar de una tilde", lea mi publicación nuevamente. Por cierto, tengo varios scripts programados en launchd y siguen el comportamiento que describo. ;-)
Constantino Tsarouhas

1
@RandyMarch hice un agente de lanzamiento en ~/Library/LaunchAgentslos argumentos: sh, -c, echo $HOME > /Users/Tyilo/launchd_home.txt. Cuando ejecutó el archivo /Users/Tyilo/launchd_home.txtcontenido /, no /Users/Tyilo.
Tyilo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.