I'm attempting to create a script for muting the system volume which gets triggered upon logging out or shutting down. This is to avoid hearing the startup chime really loudly the next time I start the machine.
Using the instructions provided in this post, I have created a RunAtLoad
launch agent that calls the script shown below:
#!/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
The idea being that the script is called and made to sleep until it receives one of the trapped signals, at which point the onLogout
function is called in order to mute the volume.
Currently it's not working as intended, the volume remains unchanged when I log out and log back in. However, I've found that if I manually unload the launch agent that launches the script (using a launchctl unload
call), then it works perfectly. The system volume is muted immediately.
Initially I thought perhaps the trapped signals weren't being received by the script when I performed a logout. But after adding some debugging code to the onLogout
function as shown below, I have eliminated this as a possible cause.
onLogout ()
{
printf "Before mute\n" >> ~/Desktop/log.txt
osascript -e "set volume output volume 0"
printf "After mute\n" >> ~/Desktop/log.txt
exit
}
When I performed a logout, and logged back in, there was a "log.txt"
file on the desktop with both of the Before mute
and After mute
debugging lines present.
And I don't believe the reason is that the osascript
call for performing the muting is somehow failing when a logout is carried out. Due to the set -o errexit
line in the script, if any part of the script fails, then it should halt execution and exit immediately. This means that if the muting operation is failing, I shouldn't be seeing the After muting
line in my log file. Indeed, when I tested this by replacing the osascript
line with something I knew was guaranteed to fail, the log contained only the Before muting
line as expected.
I'm at a loss to explain what's going on. Clearly the onLogout
function is being called correctly as explained above, but for some reason the osascript
call seems to only run when I manually unload using launchctl
. When I log out manually it just skips over it somehow.
Any help would be greatly appreciated.
Best Answer
In Terminal, execute the following command to disable the chime completely until reenabled:
sudo nvram SystemAudioVolume=%80
If this setting is not retained, try:
sudo nvram SystemAudioVolume=%01
sudo nvram SystemAudioVolume=%00
or
sudo nvram SystemAudioVolume=" "
To reenable the chime:
sudo nvram -d SystemAudioVolume
Info gleaned from:
https://business.tutsplus.com/tutorials/how-to-silence-the-startup-chime-on-a-mac--cms-21212
https://www.howtogeek.com/260693/how-to-disable-the-boot-sound-or-startup-chime-on-a-mac/