Oturumu kapatıp kapatırken tetiklenen sistem sesini kapatmak için bir komut dosyası oluşturmaya çalışıyorum. Bu, makineyi bir sonraki açışımda başlatma sesini gerçekten yüksek sesle duymaktan kaçınmak içindir.
Verilen yönergeleri kullanarak bu yazı , ben yarattık RunAtLoadaşağıda gösterilen komut dosyasını çağırır fırlatma agent:
#!/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
Komutun çağrıldığı ve kapana kısılmış sinyallerden birini alana kadar uykuya çekildiği fikri, bu noktada onLogoutses seviyesini kapatmak için işlevin çağrıldığı yer.
Şu anda amaçlandığı gibi çalışmıyor, oturumu kapatıp tekrar oturum açtığımda ses seviyesi değişmiyor. Ancak betiği başlatan başlatıcıyı el ile kaldırırsam (bir launchctl unloadçağrı kullanarak ), o zaman mükemmel çalıştığını buldum . Sistem sesi hemen kapatıldı.
Başlangıçta, çıkış yaptığımda, kapana kısılmış sinyallerin senaryo tarafından alınmadığını düşündüm. Ancak onLogout, aşağıda gösterilen işleve bazı hata ayıklama kodları ekledikten sonra , bunu olası bir neden olarak ortadan kaldırdım.
onLogout ()
{
printf "Before mute\n" >> ~/Desktop/log.txt
osascript -e "set volume output volume 0"
printf "After mute\n" >> ~/Desktop/log.txt
exit
}
Bir logout gerçekleştirilen ve geri giriş yaptığında, bir orada "log.txt"iki ile masaüstünde dosya Before muteve After muteayıklama hatları mevcut.
Ve bunun sebebinin, osascriptsusturma çağrısının bir oturum kapatma işlemi sırasında bir şekilde başarısız olduğunun olduğuna inanmıyorum . Koddaki set -o errexitsatır nedeniyle , komut dosyasının herhangi bir kısmı arızalanırsa, yürütmeyi durdurması ve derhal çıkması gerekir. Bu, susturma işlemi başarısız olursa, satırımı günlük dosyamda görmemem gerektiği anlamına gelir After muting. Gerçekten, bunu test ettiğimde, osascripthattın başarısız olacağının garantisi olduğunu bildiğim bir şeyle değiştirdiğimde , günlük yalnızca Before mutingbeklendiği gibi satırı içeriyordu .
Neler olduğunu açıklamak için kayboldum. Açıkça, onLogoutişlev yukarıda açıklandığı gibi doğru bir şekilde çağrılıyor, ancak bir nedenden dolayı osascriptçağrı yalnızca manuel olarak kaldırdığımda çalışıyor gibi görünüyor launchctl. Manuel olarak çıkış yaptığım zaman bir şekilde atlıyor.
Herhangi bir yardım çok takdir edilecektir.