Estoy intentando crear un script para silenciar el volumen del sistema que se activa al cerrar la sesión o al apagar. Esto es para evitar escuchar el timbre de inicio muy fuerte la próxima vez que inicie la máquina.
Utilizando las instrucciones proporcionadas en este puesto He creado un RunAtLoad
agente de lanzamiento que llama al script que se muestra a continuación:
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
IFS=$'\n\t'
onLogout ()
{
osascript -e "set volume output volume 0"
exit
}
trap onLogout SIGINT SIGHUP SIGTERM
while true; do
say starting
sleep 86400 &
wait $!
done
La idea es que se llame al script y se le haga dormir hasta que reciba una de las señales atrapadas, momento en el que el onLogout
para silenciar el volumen.
Actualmente no está funcionando como se pretende, el volumen se mantiene sin cambios cuando salgo y vuelvo a entrar. Sin embargo, he descubierto que si descargo manualmente el agente de lanzamiento que lanza el script (usando un launchctl unload
), entonces funciona perfectamente. El volumen del sistema se silencia inmediatamente.
Inicialmente pensé que quizás las señales atrapadas no estaban siendo recibidas por el script cuando realizaba un cierre de sesión. Pero después de añadir un poco de código de depuración al onLogout
como se muestra a continuación, he eliminado esto como una posible causa.
onLogout ()
{
printf "Before mute\n" >> ~/Desktop/log.txt
osascript -e "set volume output volume 0"
printf "After mute\n" >> ~/Desktop/log.txt
exit
}
Cuando hice un logout, y volví a entrar, había un "log.txt"
en el escritorio con los dos Before mute
y After mute
líneas de depuración presentes.
Y no creo que la razón sea que el osascript
La llamada para realizar el silenciamiento está fallando de alguna manera cuando se realiza un cierre de sesión. Debido a la set -o errexit
en el script, si cualquier parte del script falla, entonces debería detener la ejecución y salir inmediatamente. Esto significa que si la operación de silenciamiento está fallando, no debería ver el After muting
línea en mi archivo de registro. De hecho, cuando probé esto sustituyendo el osascript
línea con algo que sabía que estaba garantizado para fallar, el registro contenía sólo el Before muting
línea como se esperaba.
No sé cómo explicar lo que está pasando. Está claro que el onLogout
se llama correctamente como se ha explicado anteriormente, pero por alguna razón la función osascript
parece que sólo se ejecuta cuando descargo manualmente utilizando launchctl
. Cuando cierro la sesión manualmente se salta de alguna manera.
Cualquier ayuda será muy apreciada.