Sto tentando di creare uno script per disattivare il volume del sistema che viene attivato al momento della disconnessione o dello spegnimento. Questo per evitare di sentire il suono di avvio molto strong la prossima volta che avvierò la macchina.
Utilizzando le istruzioni fornite in questo post , Ho creato un agente di lancio RunAtLoad
che chiama lo script mostrato di seguito:
#!/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
L'idea è che lo script è chiamato e fatto in modo di dormire finché non riceve uno dei segnali intrappolati, a quel punto viene chiamata la funzione onLogout
per disattivare il volume.
Attualmente non funziona come previsto, il volume rimane invariato quando mi disconnetto e ricollego. Tuttavia, ho scoperto che se scarica manualmente l'agente di avvio che avvia lo script (utilizzando una chiamata launchctl unload
), allora funziona perfettamente. Il volume del sistema viene disattivato immediatamente.
Inizialmente pensavo che forse i segnali intrappolati non venivano ricevuti dalla sceneggiatura quando eseguivo un logout. Ma dopo aver aggiunto un po 'di codice di debug alla funzione onLogout
come mostrato di seguito, l'ho eliminato come possibile causa.
onLogout ()
{
printf "Before mute\n" >> ~/Desktop/log.txt
osascript -e "set volume output volume 0"
printf "After mute\n" >> ~/Desktop/log.txt
exit
}
Quando ho eseguito un logout e effettuato l'accesso, c'era un file "log.txt"
sul desktop con entrambe le righe di debugging Before mute
e After mute
presenti.
E non credo che la ragione sia che il richiamo di osascript
per l'esecuzione del muting fallisce in qualche modo quando viene eseguito un logout. A causa della riga set -o errexit
nello script, se qualche parte dello script fallisce, allora dovrebbe interrompere l'esecuzione e uscire immediatamente. Ciò significa che se l'operazione di muting ha esito negativo, non dovrei visualizzare la riga After muting
nel mio file di registro. Infatti, quando ho provato questo sostituendo la riga osascript
con qualcosa che sapevo che avrebbe avuto esito negativo, il registro conteneva solo la riga Before muting
come previsto.
Non riesco a spiegare cosa sta succedendo. Chiaramente la funzione onLogout
viene chiamata correttamente come spiegato sopra, ma per qualche motivo la chiamata a osascript
sembra essere eseguita solo quando scarico manualmente usando launchctl
. Quando esco manualmente, salta in qualche modo su di esso.
Qualsiasi aiuto sarebbe molto apprezzato.