¿Cómo restablecer el volumen de OS X después de la suspensión usando launchd?

2

He estado intentando escribir un archivo plist en el que, cuando vuelvo del modo de suspensión, siempre quiero que el volumen de mi Mac sea el mínimo. Sin embargo, parece que el siguiente error no funciona, con un error: 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>

Además, cuando lo siguiente no funciona:

<?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 comando osascript funciona bien si lo ejecuto desde dentro de Terminal, por lo que creo que se debe a que establezco mi lista de argumentos en la lista.

Entonces, ¿es factible tomar el argumento de cadena como "~" en launchd? ¿O hay algunas otras cosas que me estoy perdiendo aquí?

Sospecho que podría ser mejor escribir el comando osascript en el script de shell y cargar el script de shell para permitir que el volumen de Mac se minimice ... pero ¿es el enfoque correcto?

Uso OS X Mavericks 10.9.2.

    
pregunta Blaszard 27.04.2014 - 07:46

2 respuestas

2

El segundo formato de ticket de trabajo de launchd es casi correcto. Solo es necesario eliminar un conjunto de citas.

Cotizaciones

Las citas ya no son necesarias en el segundo ticket de trabajo de launchd, por lo que cambie:

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

... a ...

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

Argumentos de agrupación

En este caso, las comillas agruparon el conjunto de argumentos para que osascript se vea como un elemento. Así, osascript obtiene dos argumentos, la bandera -e y el script. Esto cumple con los requisitos del manual de osascript .

Cuando se llama a través de Terminal.app y, por lo tanto, a través del shell, las comillas son necesarias para realizar la agrupación. Cuando osascript obtiene los argumentos, el shell ha eliminado las comillas.

Sin comillas, los espacios subdividen cada elemento que se pasa a través del shell.

Cuando se llama a través de un ticket de trabajo launchd , la agrupación es intrínseca dentro de la matriz pasada como ProgramArguments . En su primer ticket, la matriz contenía nueve elementos y en el segundo ticket, la matriz contenía tres.

LaunchAgent

Asegúrese de agregar este trabajo launchd como ~/Library/LaunchAgents ya que osascript requiere un usuario activo con una sesión gráfica.

Este enfoque se aproxima a lo que hago con Power Manager en Cómo configurar el volumen al iniciar sesión .

    
respondido por el Graham Miln 27.04.2014 - 09:26
2

El segundo error debería funcionar si elimina las comillas adicionales, pero solo ejecuta el comando al iniciar sesión y no después de despertarse de la suspensión.

Puede usar sleepwatcher para ejecutar un comando después de despertarse. Ejecute sudo -v y pegue líneas como esta en 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
    
respondido por el user495470 30.04.2014 - 12:23

Lea otras preguntas en las etiquetas