Cuando intento cargar un plist LaunchAgent desde launchctl
no 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 -c
sin que funcione.
El código de error es:
`com.tyilo.test: bash: ~/script.sh: No such file or directory`
Respuestas:
EnableGlobbing
permite la expansión de tilde y comodines paraProgramArguments
:No afecta
Program
oWatchPaths
, sin embargo, la expansión de tilde funcionaWatchPaths
de 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
launchd
cwd (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$HOME
variable.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
sh
y laHOME
variable 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
$user
en 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
bash
como 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.sh
en 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),
launchd
el 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.sh
lugar de~/script.sh
. ;-)fuente
/
, no '~'.~/Library/LaunchAgents
los argumentos:sh
,-c
,echo $HOME > /Users/Tyilo/launchd_home.txt
. Cuando ejecutó el archivo/Users/Tyilo/launchd_home.txt
contenido/
, no/Users/Tyilo
.