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`

Respuestas:
EnableGlobbingpermite la expansión de tilde y comodines paraProgramArguments:No afecta
ProgramoWatchPaths, sin embargo, la expansión de tilde funcionaWatchPathsde manera predeterminada.fuente
Mac OS X 10.10+).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.fuente
sh; cuando Bash está involucrado comosh, se ejecuta en modo de compatibilidad POSIX, que deshabilita muchas extensiones de Bash.~/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)Lo más confiable que encontré al hacer esto fue mediante el uso
shy laHOMEvariable de entorno:Nota: las cotizaciones son obligatorias.
fuente
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
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.fuente
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.¿Es ejecutable?
chmod 700 ~/script.shen la terminal. Además, no usaría $ HOME o ~, sino la ruta real al archivo.
fuente
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. ;-)fuente
/, no '~'.~/Library/LaunchAgentslos argumentos:sh,-c,echo $HOME > /Users/Tyilo/launchd_home.txt. Cuando ejecutó el archivo/Users/Tyilo/launchd_home.txtcontenido/, no/Users/Tyilo.