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 RunAtLoad
aş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 onLogout
ses 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 mute
ve After mute
ayıklama hatları mevcut.
Ve bunun sebebinin, osascript
susturma ç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 errexit
satı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, osascript
hattı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 muting
beklendiği gibi satırı içeriyordu .
Neler olduğunu açıklamak için kayboldum. Açıkça, onLogout
iş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.