El servicio Applescript falla debido a restricciones faltantes

Escribí un Servicio de automatización que ejecuta un pequeño applescript para configurar el volumen y reproducir un sonido.

Para activar el servicio, lo copié /Library/Servicese hice un archivo chmod +x. Para registrar un atajo de teclado para el servicio, ejecuté defaults write -g NSUserKeyEquivalents '{"HelloWorld" = "$@~1";}'donde HelloWorldestá el nombre del servicio como se ve en el menú Servicios y $@~1mi atajo (que se resuelve en ⌘+⌥+⇧+1)

Después de reiniciar, puedo ver el servicio en el menú con el acceso directo al lado. Cuando presiono la combinación de teclas deseada, aparece una alerta que me dice que el script encontró un error. También aparece un error en el registro:

Faltan restricciones detectadas para . No se puede colocar porque no hay suficientes restricciones para definir completamente el tamaño y el origen. Agregue las restricciones que faltan o establezca translateAutoresizingMaskIntoConstraints=YES y se generarán las restricciones automáticamente. Si esta vista se presenta manualmente en macOS 10.12 y versiones posteriores, puede optar por no llamar a [superdiseño] desde su anulación. Establezca un punto de interrupción en DETECTED_MISSING_CONSTRAINTS para depurar. Este error solo se registrará una vez.

Esto sugiere un error con alguna vista que no se inicializó correctamente, pero no estoy usando ninguna vista.

Este es el contenido del flujo de trabajo de Automator:

on run

    if (get output volume of (get volume settings)) < 50 then
        set volume output volume 50
    end if

    do shell script "afplay /Library/Application\ Support/HelloWorld/hello.mp3"

    return
end run
Lo resolví. No puede escapar de los espacios en do shell scriptlos argumentos. Tuve que poner el nombre del archivo entre comillas dobles (que puede escapar). ¡El mensaje de error es enormemente engañoso!
Es perfectamente aceptable escribir una respuesta a su propia pregunta y también es mejor que colocarla en un comentario. Luego, después del período de espera, puede aceptar su propia respuesta para mejorar su reputación.
EDITE su pregunta con una nota que explique que sus "espacios escapados" no son válidos en un argumento de script do shell @clemsamlang No entiendo lo que quiere decir con eso, lo siento.
Lo que quise decir es que podrías escribir un "[EDITAR: Encontré la respuesta, mira mi respuesta elegida.]" muy breve justo al comienzo de tu pregunta. . . . (Eliminaré mi comentario anterior ya que ahora publicaste tus "hallazgos"). Gracias y +1.

Respuestas (1)

Dado que se solicitó en los comentarios (lo siento, tomó tanto tiempo), aquí hay una versión funcional del script. El truco es poner el nombre del archivo (que contiene espacios) entre comillas dobles, porque se pueden escapar.

on run

    if (get output volume of (get volume settings)) < 50 then
        set volume output volume 50
    end if

    do shell script "afplay \"/Library/Application Support/HelloWorld/hello.mp3\""

    return
end run
Los espacios escapados están perfectamente bien en un do shell script comando , solo tiene que usar dos barras invertidas, no una cuando escapa espacios en un do shell script comando , por ejemplo, do shell script "afplay /Library/Application\\ Support/HelloWorld/hello.mp3"¡funcionaría bien!