En este artículo vamos a crear con unas pocas líneas de código dos scripts para automatizar tareas repetitivas. Para automatizar tareas en macOS podemos utilizar BASH, AppleScript y JavaScript. En esta ocasión vamos a combinar bash con AppleScript.

El primer script yo lo llamo buen día, y es lo primero que hago todos los días nada más encender el Mac. La función se compone de un if else, en el if le paso dos condiciones. Vamos a ver la primera de las condiciones:

if [ $(date +%u) -le 5 ]

Con date invocamos el tiempo y el día de la semana en el que estamos, y con el flag +%u le decimos que asigne un número del 1 al 7 a cada día de la semana. Lo siguiente es -le 5, lo que quiere decir es que compruebe si el día en el que estamos es menor o igual a 5, comprueba si estamos entre lunes y viernes. Si se cumple esta condición comprobará la segunda. Vamos a verla:

&& [ $(date +%H) -le 18 ]

Ahora volvemos a invocar el tiempo y el día en el que estamos, pero esta vez con el flag -%H le indicamos que distribuya las horas en 24, si la condición se cumple vamos a ejecutar las ordenes que le pasamos en el if.

Lo primero es imprimir en el terminal la sentencia: ‘A trabajar!’

Lo siguiente es ejecutar una serie de ordenes en AppleScript a través de osascript, vamos a verlo:

osascript -e '
set apps to {"Opera", "Slack", "Mail", "Sublime Text", "Sketch", "Numi", "Skype", "log", "Bear", "Spotify"}
    repeat with i from 1 to (count of items in apps)
        tell application (item i of apps)
            activate
        end tell
    end repeat
'

Lo primero es crear una lista con todas las aplicaciones que usamos para trabajar. Lo siguiente es decirle que repita una acción con todos los elementos de nuestra lista, y esta acción no es otra que ‘activate’ para ir activando todas las aplicaciones de la lista.

Y ya por último lanzamos una notificación de macOS que se ejecutara cuando se inicien todas las aplicaciones de la lista. Para ello utilizo terminal-notifier

open -a terminal-notifier --args -message "A trabajar!" -title "⚒" -appIcon "/Users/jorgeatgu/Downloads/logo.png" -sound "Glass"

Lanzamos terminal notifier con el flag –args, a continuación el flag -message donde incluímos el mensaje que queremos que muestre, el siguiente flag es -title para pasarle un título, con el flag -appIcon podemos pasarle un icono para la notificación y por último un sonido con el flag -sound.

Aquí teneis la función completa:

function buendia() {

 if [ $(date +%u) -le 5 ] && [ $(date +%H) -le 18 ]
       then
       echo 'A trabajar!'
       osascript -e '
       set apps to {"Opera", "Slack", "Mail", "Sublime Text", "Sketch", "Numi", "Skype", "log", "Bear", "Spotify"}
       repeat with i from 1 to (count of items in apps)
       tell application (item i of apps)
       activate
       end tell
       end repeat
       '
       open -a terminal-notifier --args -message "A trabajar!" -title "⚒" -appIcon "/Users/jorgeatgu/Downloads/logo.png" -sound "Glass"
   else
     echo 'No estas en el trabajo :)'
     osascript -e '
     set apps to {"Opera", "Spark", "tweetbot"}
     repeat with i from 1 to (count of items in apps)
     tell application (item i of apps)
     activate
     end tell
     end repeat
     '
   fi

}

Y ahora vamos a ver que pasa con el else, es decir, si ninguna de las dos condiciones se cumplen ejecutará el siguiente código.

echo 'No estas en el trabajo :)'
osascript -e '
set apps to {"Opera", "Spark", "tweetbot"}
repeat with i from 1 to (count of items in apps)
tell application (item i of apps)
activate
end tell
end repeat
'

Lo único que cambia aquí es la lista de apps que suelo usar cuando no estoy trabajando.

Automatizando la limpieza

Quizás recordéis un artículo publicado en faq-mac donde nos recomendaban comenzar el año creando una rutina mensual para el mantenimiento de nuestros macs. Es bastante molesto ir cada mes a buscar el artículo y ejecutar los diferentes comandos, así que vamos a automatizarlo con bash y AppleScript.

function cleanMacOS() {

    osascript -e '
    display notification "Limpiando macOS 🖥" with title "Empezamos!"'
    sudo rm -rf ~/Library/Caches/ &&
    sudo update_dyld_shared_cache -debug &&
    sudo update_dyld_shared_cache -force &&
    osascript -e '
    display notification "Reiniciando 🙋" with title "Ahora volvemos!"
    do shell script "/bin/sleep 3"
    tell application "System Events" to restart'
}

Lo primero es opcional, y es simplemente una notificación que nos avisa de que vamos a empezar a limpiar. Lo siguiente es ejecutar los comandos tal y como vienen en el artículo, para concatenar los comandos usamos && así hasta que no acabe un comando no empezará el otro. Ya por último lanzamos una notificación avisando de que vamos a reiniciar, y ejecutamos la orden con «System Events» to restart.

Aquí teneis la función completa

function cleanMacOS() {

    osascript -e '
    display notification "Limpiando macOS 🖥" with title "Empezamos!"'
    sudo rm -rf ~/Library/Caches/ &&
    sudo update_dyld_shared_cache -debug &&
    sudo update_dyld_shared_cache -force &&
    osascript -e '
    display notification "Reiniciando 🙋" with title "Ahora volvemos!"
    do shell script "/bin/sleep 3"
    tell application "System Events" to restart'
}

Ejecutando las funciones

Yo uso como shell en macOS oh-my-zsh y para ejecutar las funciones en mi terminal las guardo todas en el mismo archivo functions.sh dentro de una carpeta llamada func. Luego invoco el archivo desde .zshrc que es el perfil de configuración de zsh de la siguiente manera:

source ~/.oh-my-zsh/func/functions.sh

Así solo tengo que escribir el nombre de la función que quiero ejecutar.

También puedes ejecutar las funciones que previamente has guardado en un archivo con

sh ruta/donde/esta/la/funcion

In this article


Join the Conversation

3 comments

  1. sault

    Cojonudo

  2. osmio

    Muy bueno, muchas gracias ¡a trabajar!

  3. damarfu

    Genial idea de como automatizar algunos procesos. Pero creo que para los más inexpertos falta información.
    Decir que el fichero.sh la primera línea debería ser: #!/bin/bash
    Para ejecutar el fichero y llamar la función desde el terminal de MacOS hay que hacerlo con el siguiente comando: «$source /directorio-contenedor/fichero.sh; nombre-de-la-funcion» (ten en cuenta que si los comandos puesto en la función necesita privilegios de administrador tienes que poner delante «sudo» y te pedirá tu clave de administrador).

    Espero que ayude a los neófitos como yo.

    Salu2, David.