¿Cómo puedo activar sucesivamente un AppleScript muy rápidamente?

Fondo

Para un ajuste fino del volumen, uso el siguiente AppleScript:

try
    do shell script "killall afplay"
end try
set currentVolume to output volume of (get volume settings)
set volume output volume (currentVolume + 2)
    -- play volume changing sound at new volume
do shell script "afplay /System/Library/LoginPlugins/BezelServices.loginPlugin/Contents/Resources/volume.aiff"

Esto aumentará el volumen en un 2% y reproducirá el nuevo volumen una vez como de costumbre.

Problema

El uso de este script tiene desventajas:

  • Cuando activé el script rápidamente varias veces seguidas, no respondió tan rápido como lo haría el cambio de volumen "normal".
  • Para cada ejecución, el sonido del volumen se reproduce en toda su duración.

Parece que mi problema se debe a una limitación de cómo se activan los scripts . Por ejemplo, cuando uso FastScript, no volverá a ejecutar el script antes de que haya terminado. Lo mismo ocurre con Quicksilver.

Sin embargo, cuando asigno la "secuencia de comandos de menor volumen" a Quicksilver y la "secuencia de comandos de mayor volumen" a FastScripts, puedo activar ambas secuencias de comandos muy rápidamente, una después de la otra, por lo que: la secuencia de comandos está bien. Creo que mi problema se debe a cómo se activan los scripts.

Pregunta

¿Cómo puedo activar sucesivamente un script muy rápido?

Respuestas (2)

Agregar > /dev/null 2>&1 &al final del do shell scriptcomando debería funcionar. Esto redirige stdouty stderrdel do shell scriptcomando /dev/nully ejecuta el script de shell en segundo plano, lo que significa que AppleScript ya no necesita esperar a que regrese el comando stdouto stderrantes de que finalice el script de AppleScript. Eso significa que finaliza y se puede ejecutar de nuevo mucho más rápido.

Tampoco debería necesitar el trycontrolador al principio. El siguiente script modificado debería funcionar:

set currentVolume to output volume of (get volume settings)
set volume output volume (currentVolume + 2)
-- play volume changing sound at new volume
do shell script "afplay /System/Library/LoginPlugins/BezelServices.loginPlugin/Contents/Resources/volume.aiff > /dev/null 2>&1 &" 

Recibí este consejo de MacScripter (un excelente recurso para AppleScripting) en una publicación sobre cómo ejecutar varias instancias de un script de shell.

¿Qué tal agregar un ampersand al final de la afplaylínea para que la parte del guión se reproduzca en segundo plano? Como esto

afplay /System/Library/LoginPlugins/BezelServices.loginPlugin/Contents/Resources/volume.aiff &
Obtuve la sintaxis de eso un poco mal (comillas en el lugar equivocado). debería haber afplay /System/Library/LoginPlugins/BezelServices.loginPlugin/Contents/Resources/volume.aiff &sido No digo que eso ayude, solo quiero corregirme :-)