Estoy intentando crear una secuencia de comandos para silenciar el volumen del sistema que se activa al cerrar o cerrar sesión. Esto es para evitar escuchar el sonido de inicio muy fuerte la próxima vez que inicie la máquina.
Usando las instrucciones proporcionadas en esta publicación , He creado un agente de lanzamiento RunAtLoad
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 el script se llame y se ponga en reposo hasta que reciba una de las señales atrapadas, en cuyo punto se llama a la función onLogout
para silenciar el volumen.
Actualmente no funciona como estaba previsto, el volumen no se modifica cuando cierro sesión y vuelvo a iniciar sesión. Sin embargo, he descubierto que si descargo manualmente el agente de inicio que inicia el script (con una llamada launchctl unload
), entonces funciona perfectamente. El volumen del sistema se silencia inmediatamente.
Inicialmente, pensé que tal vez las señales atrapadas no estaban siendo recibidas por la secuencia de comandos cuando realizaba un cierre de sesión. Pero después de agregar algún código de depuración a la función onLogout
como se muestra a continuación, eliminé 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 realicé un cierre de sesión y volví a iniciar sesión, había un archivo "log.txt"
en el escritorio con las líneas de depuración de Before mute
y After mute
presentes.
Y no creo que la razón sea que la llamada osascript
para realizar el silenciamiento está fallando de alguna manera cuando se lleva a cabo un cierre de sesión. Debido a la línea set -o errexit
en la secuencia de comandos, si alguna parte de la secuencia de comandos falla, debe detener la ejecución y salir inmediatamente. Esto significa que si la operación de anulación falla, no debería ver la línea After muting
en mi archivo de registro. De hecho, cuando probé esto reemplazando la línea osascript
con algo que sabía que estaba garantizado para fallar, el registro solo contenía la línea Before muting
como se esperaba.
No puedo explicar lo que está pasando. Claramente, la función onLogout
se está llamando correctamente como se explicó anteriormente, pero por alguna razón, la llamada osascript
parece que solo se ejecuta cuando descargo manualmente usando launchctl
. Cuando me desconecto manualmente, simplemente lo omite de alguna manera.
Cualquier ayuda sería muy apreciada.