20 votes

Exécuter bash script à la connexion stocké dans le dossier home ?

Lorsque j'essaie de charger un plist LaunchAgent à partir de launchctl Je n'arrive pas à trouver 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 ~ avec $HOME . J'ai également essayé d'utiliser bash -c sans que cela ne fonctionne.

Le code d'erreur est le suivant :

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

0 votes

Je ne peux pas utiliser le chemin complet car il doit être utilisé sur plusieurs comptes et ordinateurs.

1 votes

S'il doit être utilisé par plusieurs comptes, vous devriez le mettre dans /usr/local/bin/ au lieu d'en faire plusieurs copies dans le $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.

18voto

MoOx Points 577

EnableGlobbing ne fonctionne pas sur OS X Yosemite 10.10 . Il a été déprécié ( 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) est / donc vous ne pouvez pas utiliser ./ comme certaines personnes l'ont dit.

Pour exécuter un script depuis votre domicile, le moyen le plus simple est d'utiliser (bash|zsh|sh) -c . option. De cette façon, vous aurez la possibilité d'utiliser le tilde ~ ou le $HOME variable.

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

Je ne pense pas que vous puissiez utiliser le tilde avec sh lorsque Bash est impliqué en tant que sh il fonctionne en mode de compatibilité POSIX, ce qui désactive de nombreuses extensions de Bash.

0 votes

~/ est un gobeur, donc pas de soutien. Vous pouvez utiliser ./ à la place, tant que le démon est enregistré dans la bibliothèque personnelle de l'utilisateur. ( ~/Library/LaunchAgents )

15voto

Fuzzy Purple Monkey Points 702

EnableGlobbing permet l'expansion des tildes et des 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 Program o WatchPaths mais l'expansion du tilde fonctionne en WatchPaths par défaut.

0 votes

C'est une bien meilleure façon de faire. Y a-t-il un endroit où vous pouvez voir la documentation pour les clés dans une plist LaunchAgent ?

0 votes

Man launchd.plist. Ou voir cet article de blog o mon site web .

1 votes

Cela m'a aussi aidé. J'ai essayé dans les versions suivantes de Mac OS X : 10.7, 10.8, et 10.9.

10voto

Tyilo Points 5337

La méthode la plus fiable que j'ai trouvée pour faire cela était d'utiliser sh et le HOME variable 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>

Note : les devis sont nécessaires.

0 votes

Cela fonctionne toujours dans 2022 sur un Mac avec MacOS Monterey, ce qui est assez génial - puisque j'ai passé au moins une heure de tests différents pour faire fonctionner un fichier .sh via un .plist dans ~/Bibliothèque/LaunchAgents/

1voto

moodforaday Points 2633

Est-il exécutable ?

chmod 700 ~/script.sh

dans le terminal. De même, je n'utiliserais pas $HOME ou ~ mais plutôt le chemin d'accès réel au 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>

0 votes

Quelle est la raison de ce downvote ?

1voto

andy Points 3302

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 l'utilisateur est le dossier Home. UNIX fait référence au répertoire de base avec un point dans le chemin.

Donc, en gros, utilisez ./script.sh au lieu de ~/script.sh . ;-)

3 votes

Non, le répertoire de travail de launchd est en fait / et non "~".

0 votes

@Tyilo Je ne suis pas sûr de ce que vous voulez dire. Si vous voulez dire "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 un slash au lieu d'un tilde", relisez mon post. A propos, j'ai plusieurs scripts programmés dans launchd et ils suivent le comportement que je décris ;-)

1 votes

@RandyMarch J'ai fait un agent de lancement en ~/Library/LaunchAgents avec les arguments : sh , -c , echo $HOME > /Users/Tyilo/launchd_home.txt . Lorsque l'on exécute le fichier /Users/Tyilo/launchd_home.txt contenu / pas /Users/Tyilo .

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X