Tengo un Applescript que conecta un altavoz bluetooth a mi Mac y cambia "Reproducir efectos de sonido a través de:" a "Altavoces internos".
Quiero que este script se ejecute cada vez que enciendo mi altavoz bluetooth. Actualmente estoy activando la secuencia de comandos manualmente con un atajo de teclado cada vez que enciendo el altavoz, pero sería aún más conveniente si pudiera configurar la secuencia de comandos para que se ejecute automáticamente cada vez que el altavoz bluetooth esté disponible para la Mac, preferiblemente sin usar terceros. software de fiesta
¿Hay alguna forma de hacer esto?
Esta es una especie de cosa difícil de hacer si no desea utilizar software de terceros. Sin embargo, con algunos scripts de bash y plist podemos hacer que funcione.
Primero, en su ~/Library/LaunchAgents
carpeta cree el siguiente archivo .plist (en este caso lo he nombrado com.my.bluetoothdetector.plist
; si cambia el nombre, asegúrese de cambiar también la línea 4 en el archivo):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.my.bluetoothdetector</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/Users/YOURUSERNAME/Desktop/script.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Library/Preferences/com.apple.Bluetooth.plist</string>
</array>
</dict>
</plist>
El archivo anterior llamará a cualquier secuencia de comandos que se encuentre /Users/YOURUSERNAME/Desktop/script.sh
cuando haya un cambio en el entorno de Bluetooth. Por supuesto, puede cambiar la ubicación del archivo llamado desde el escritorio a donde desee (asegurándose de que sea una ruta completa).
Ahora, crearemos un script bash que, cuando lo active nuestro com.my.bluetoothdetector.plist
archivo, verificará si su dispositivo está conectado. En este caso, guardaremos este archivo en /Users/USERNAME/Desktop/script.sh
:
#!/bin/bash
connectedyesorno="$(system_profiler SPBluetoothDataType | awk '/BLUETOOTHDEVICENAME/{f=1}/Connected:/ && f{print $2; exit}')"
if [ "$connectedyesorno" == "Yes" ]
then
open /Applications/YOURAPPNAME.app
elif [ "$connectedyesorno" == "No" ]
then
echo "Not connected..."
else
echo "ERROR"
fi
Aquí, sustituya BLUETOOTHDEVICENAME
el nombre de su dispositivo y la /Applications/YOURAPPNAME.app
parte del open /Applications/YOURAPPNAME.app
comando por la ubicación de la aplicación Automator/AppleScript que desea ejecutar. También puede reemplazar esta línea por completo para ejecutar cualquier script de shell que desee cuando el dispositivo esté conectado, lo que puede anular la necesidad de tener una aplicación AppleScript/Automator separada para llamar.
Finalmente, usa el comando:
launchctl load ~/Library/LaunchAgents/com.my.bluetoothdetector.plist
Esto iniciará el proceso que verificará el cambio en el entorno de Bluetooth y luego llamará script.bash
cuando se detecte.
Ahora, con suerte, cuando conecte el dispositivo Bluetooth a su computadora, después de solo unos segundos, ¡su archivo AppleScript/Automator debería ejecutarse!
Tengo un Applescript que conecta un altavoz bluetooth a mi Mac...
Los dispositivos bluetooth conectados previamente deberían conectarse automáticamente a una Mac cuando estén disponibles. Si este no es su caso, tal vez haya algún tipo de problema relacionado con la configuración de su bluetooth. Echa un vistazo a este artículo si el problema persiste.
PD En el futuro, si desea eliminar esto, ejecute los siguientes comandos:
launchctl unload ~/Library/LaunchAgents/com.my.bluetoothdetector.plist
rm -r ~/Library/LaunchAgents/com.my.bluetoothdetector.plist
rm -r ~/Desktop/script.sh
.plist
archivo que está creando el error. Mejor.plist
archivo en mi respuesta original de acuerdo con la documentación oficial de Apple. ¿Recibes algún error al ejecutar el launchctl
comando? Además, si solo se ejecuta system_profiler SPBluetoothDataType | awk '/BLUETOOTHDEVICENAME/,0' | grep "Connected" | head -1 | sed 's/.*Connected: //'
solo (asegurándose de reemplazar SOLOBLUETOOTHDEVICENAME
), ¿obtiene al menos un No
/ Yes
??awk
, entonces realmente no hay necesidad de invocar las 3 pipes
utilidades adicionales y 3 adicionales, grep
y head
no sed
son necesarias. Por cierto, en este caso, el uso grep -m 1 "Connected"
niega la necesidad de, | head -1
sin embargo, los siguientes usos awk
por sí mismos para hacer lo que estaban haciendo los pipes
grep
adicionales :head
sed
connectedyesorno="$(system_profiler SPBluetoothDataType | awk '/BLUETOOTHDEVICENAME/{f=1}/Connected:/ && f{print $2; exit}')"
awk
comando existente , puede usar lo siguiente:connectedyesorno="$(system_profiler SPBluetoothDataType | awk '/BLUETOOTHDEVICENAME/,0 {if(/Connected:/){print $2; exit}}')"
sed
, grep
, awk
etc. ¡Por lo general, me muevo hasta que funciona! :) Sin embargo, editaré mi respuesta original para cambiar el comando más antiguo e ineficiente con el que sugirió para que sea más limpio.
JBis