2 votes

Comment réinitialiser le volume d'OS X après la mise en veille en utilisant launchd ?

J'essaie d'écrire un fichier plist sur lequel, lorsque je reviens du mode veille, je veux toujours que le volume de mon Mac soit réduit au minimum. Cependant, il semble que le plist suivant ne fonctionne pas, avec une erreur : 1:1: syntax error: Expected string but found end of script. (-2741)

<?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>KeepAlive</key>
        <false/>
        <key>Label</key>
        <string>my.plist</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/bin/osascript</string>
            <string>-e</string>
            <string>"</string>
            <string>set</string>
            <string>volume</string>
            <string>output</string>
            <string>volume</string>
            <string>0</string>
            <string>"</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

Aussi, quand ce qui suit ne fonctionne pas :

<?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>KeepAlive</key>
        <false/>
        <key>Label</key>
        <string>my.plist</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/bin/osascript</string>
            <string>-e</string>
            <string>"set volume output volume 0"</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

El osascript fonctionne bien si je l'exécute à partir de Terminal, donc je pense que c'est dû à la façon dont j'ai défini ma liste d'arguments dans la plist.

Donc, est-il possible de prendre l'argument de la chaîne de caractères comme "~" dans launchd ? Ou y a-t-il d'autres choses qui m'échappent ?

Je soupçonne qu'il serait préférable d'écrire le fichier osascript dans le shell script, et charger le shell script pour permettre au volume du Mac de se minimiser... mais est-ce la bonne approche ?

J'utilise OS X Mavericks 10.9.2.

2voto

Graham Miln Points 39606

Le format du ticket du deuxième travail de launchd est presque correct. Seule une série de guillemets doit être supprimée.

Citations

Les guillemets ne sont plus nécessaires dans le deuxième ticket de travail de launchd, donc à changer :

<string>"set volume output volume 0"</string>

à

<string>set volume output volume 0</string>

Regroupement des arguments

Dans ce cas, les guillemets ont regroupé l'ensemble des arguments de osascript à voir comme un seul élément. Ainsi osascript reçoit deux arguments, le drapeau -e et le script. Cela répond aux exigences de la manuel osascript .

Lorsqu'il est appelé par Terminal.app et donc par le shell, les guillemets sont nécessaires pour effectuer le regroupement. Lorsque osascript reçoit les arguments, le shell a supprimé les guillemets.

Sans les guillemets, les espaces subdivisent chaque élément transmis par le shell.

Lorsqu'il est appelé par un ticket de travail de launchd le regroupement est intrinsèque au tableau passé en tant que ProgramArguments . Dans votre premier billet, le tableau contenait neuf éléments et dans le second billet, le tableau en contenait trois.

LaunchAgent

Assurez-vous d'ajouter ce travail launchd en tant que ~/Library/LaunchAgents como osascript nécessite un utilisateur actif avec une session graphique.

Cette approche se rapproche de ce que je fais avec Power Manager en Comment régler le volume lors de la connexion .

0 votes

Merci. Comment puis-je savoir quels sont les arguments qui peuvent être spécifiés en une seule ligne (comme dans ce cas) et ceux qui ne le peuvent pas (d'où un grand nombre d'arguments de type <string></string> ) ?

0 votes

J'ai élargi la réponse pour parler un peu des citations et des regroupements. J'espère que cela vous aidera.

0 votes

Merci pour l'excellent suivi. Alors par exemple, si je veux exécuter mysql -uroot -e "sql_statement" alors la division est mysql , -u , root , -e et sql_statement (sans guillemets), n'est-ce pas ?

2voto

La deuxième plist devrait fonctionner si vous supprimez les guillemets supplémentaires, mais elle n'exécute la commande qu'à l'ouverture de la session et non après le réveil.

Vous pouvez utiliser veilleur de nuit pour exécuter une commande après le réveil du sommeil. Exécuter sudo -v et coller des lignes comme celle-ci dans un shell :

curl http://www.bernhard-baehr.de/sleepwatcher_2.2.tgz|tar -x
sudo mkdir -p /usr/local/sbin /usr/local/share/man/man8
sudo cp sleepwatcher_2.2/sleepwatcher /usr/local/sbin
sudo cp sleepwatcher_2.2/sleepwatcher.8 /usr/local/share/man/man8
cp sleepwatcher_2.2/config/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist
echo $'#!/bin/sh\nosascript -e "set volume output volume 0"'>~/.sleep
chmod +x ~/.sleep

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