Lorsque j'essaie de charger un plist LaunchAgent depuis, launchctl
je ne peux pas savoir comment exécuter un script dans le répertoire personnel.
Mon code est:
<?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>
J'ai essayé à la fois avec et sans bash et aussi en remplaçant ~
par $HOME
. J'ai également essayé de l'utiliser bash -c
sans que cela fonctionne.
Le code d'erreur est:
`com.tyilo.test: bash: ~/script.sh: No such file or directory`
Réponses:
EnableGlobbing
permet l'expansion de tilde et de caractères génériques pourProgramArguments
:Cela n'affecte pas
Program
ouWatchPaths
, cependant, l'extension tilde fonctionneWatchPaths
par défaut.la source
Mac OS X 10.10+
).EnableGlobbing ne fonctionne pas sur OS X Yosemite 10.10 . Il est obsolète ( réf ).
Vous pouvez voir dans les journaux
The EnableGlobbing key is no longer respected. Please remove it.
(de/var/log/system.log
)Le problème est que
launchd
cwd (répertoire de travail actuel) l'est/
, donc vous ne pouvez pas l'utiliser./
comme certains l'ont dit.Pour exécuter un script depuis votre domicile, le plus simple est d'utiliser
(bash|zsh|sh)
-c
. option. De cette façon, vous aurez la possibilité d'utiliser le tilde~
ou la$HOME
variable.la source
sh
; lorsque Bash est impliqué en tant quesh
, il s'exécute en mode de compatibilité POSIX, ce qui désactive de nombreuses extensions Bash.~/
gobe donc pas pris en charge. Vous pouvez utiliser à la./
place tant que le démon est enregistré dans la bibliothèque personnelle des utilisateurs. (~/Library/LaunchAgents
)Le plus fiable que j'ai trouvé en faisant cela était en utilisant
sh
et laHOME
variable d'environnement:Remarque: les devis sont obligatoires.
la source
Il serait utile de savoir pourquoi le script doit être exécuté à partir du répertoire personnel de l'utilisateur. Si vous avez besoin du nom abrégé de l'utilisateur pour le script, vous pouvez l'obtenir en l'attribuant à une variable comme dans
Ensuite, utilisez
$user
dans le script.Je voudrais vraiment mettre le script ailleurs que dans un répertoire personnel, puis il est accessible par d'autres utilisateurs sur le même ordinateur. Vous pouvez utiliser le répertoire partagé ou mettre le script dans / Library / Scripts /
Vous devrez utiliser le chemin complet pour le plist launchd. De plus, dans votre liste launchd, vous n'aurez pas besoin de spécifier
<string>bash</string>
car vous devriez avoir le shebang dans le script et il devrait être exécutable.la source
bash
de la commande à exécuter est une bonne solution de rechange sans réel préjudice. S'il n'a pas le shebang, ou oublie de rendre le script exécutable (o = rwx), alors bash invoquera / exécutera toujours le script.Est-il exécutable?
chmod 700 ~/script.sh
dans le terminal. De plus, je n'utiliserais pas $ HOME ou ~ mais plutôt le chemin réel vers le fichier.
la source
Si votre script est un agent utilisateur (et donc situé dans la bibliothèque du dossier Home),
launchd
le répertoire de travail actuel de est le dossier Home. UNIX fait référence au répertoire personnel avec un point dans le chemin d'accès.Donc, fondamentalement, utilisez
./script.sh
plutôt que~/script.sh
. ;-)la source
/
pas «~».~/Library/LaunchAgents
avec les arguments suivants :sh
,-c
,echo $HOME > /Users/Tyilo/launchd_home.txt
. Quand a couru le fichier/Users/Tyilo/launchd_home.txt
contenu/
, non/Users/Tyilo
.