Exécuter le script bash à la connexion stockée dans le dossier d'accueil?

19

Lorsque j'essaie de charger un plist LaunchAgent depuis, launchctlje 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 -csans que cela fonctionne.

Le code d'erreur est:

`com.tyilo.test: bash: ~/script.sh: No such file or directory`
Tyilo
la source
Essayez de mettre le chemin complet, par exemple /Users/name/script.sh (Je voudrais également rendre le script exécutable et avec la première ligne #! / Bin / bash et l'exécuter directement)
user151019
Je ne peux pas utiliser le chemin complet car il doit être utilisé sur plusieurs comptes et ordinateurs.
Tyilo
1
S'il doit être utilisé avec plusieurs comptes, vous devez le placer dans / usr / local / bin / au lieu d'en faire plusieurs copies dans $ HOME de chaque utilisateur. Il serait utile de savoir ce que vous essayez d'accomplir avec ce script. Cela ressemble à un travail pour un LoginHook, IMO.
TJ Luoma

Réponses:

14

EnableGlobbingpermet l'expansion de tilde et de caractères génériques pour ProgramArguments:

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

Cela n'affecte pas Programou WatchPaths, cependant, l'extension tilde fonctionne WatchPathspar défaut.

Lri
la source
C'est une bien meilleure façon de le faire. Y a-t-il un endroit où vous pouvez afficher la documentation des clés dans un plist LaunchAgent?
Tyilo
homme launchd.plist. Ou consultez cet article de blog ou mon site Web .
Lri
1
Cela m'a aussi aidé. Testé dans les versions suivantes de Mac OS X: 10.7, 10.8 et 10.9.
Dj S
6
Remarque: cette fonctionnalité a été supprimée dans Yosemite ( Mac OS X 10.10+).
alex gray
On dirait que ce n'est pas non plus en 10.9.5
ocodo
18

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 launchdcwd (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 $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>
MoOx
la source
2
Je ne pense pas que vous puissiez utiliser le tilde avec sh; lorsque Bash est impliqué en tant que sh, il s'exécute en mode de compatibilité POSIX, ce qui désactive de nombreuses extensions Bash.
tripleee
~/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)
Bruno
9

Le plus fiable que j'ai trouvé en faisant cela était en utilisant shet la HOMEvariable d'environnement:

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

Remarque: les devis sont obligatoires.

Tyilo
la source
2

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

user=`whoami`

Ensuite, utilisez $userdans 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.

afragen
la source
La spécification bashde 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.
Jason Salaz
1
Il doit déjà y avoir une variable pour le nom d'utilisateur, telle que $ USER ou $ LOGNAME. De plus, l'emplacement habituel pour les scripts Unix partagés serait / usr / local / bin / (pas que vous ne puissiez pas les mettre ailleurs, mais / usr / local / bin / sera probablement déjà dans votre $ PATH).
TJ Luoma
Utiliser whoami n'est qu'une autre méthode pour obtenir les mêmes informations que $ USER ou $ LOGNAME. J'ai suggéré les emplacements ci-dessus car je ne voulais rien présumer de l'interrogateur. De plus, avant d'essayer de faire fonctionner le launchd plist, le script doit réellement pouvoir s'exécuter à partir de la CLI.
afragen
1

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.

<?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>
TJ Luoma
la source
Quelle est la raison du downvote?
TJ Luoma
1

Si votre script est un agent utilisateur (et donc situé dans la bibliothèque du dossier Home), launchdle 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.shplutôt que ~/script.sh. ;-)

Constantino Tsarouhas
la source
3
Non, le répertoire de travail de launchd n'est /pas «~».
Tyilo
@ Tyilo, je ne sais pas ce que tu veux dire. Si vous voulez dire que "le répertoire de travail de launchd est la racine, dans tous les cas, même en mode utilisateur", veuillez fournir une référence. Si vous voulez dire "launchd utilise une barre oblique au lieu d'un tilde", relisez mon article. Soit dit en passant, j'ai plusieurs scripts programmés dans launchd et ils suivent le comportement que je décris. ;-)
Constantino Tsarouhas
1
@RandyMarch J'ai fait un agent de lancement ~/Library/LaunchAgentsavec les arguments suivants : sh, -c, echo $HOME > /Users/Tyilo/launchd_home.txt. Quand a couru le fichier /Users/Tyilo/launchd_home.txtcontenu /, non /Users/Tyilo.
Tyilo