Execute Only If Device is Attached

Have you ever been in the situation where you needed to open an application but you only want to open this particular application if a specific device is attached? For instance, when there is a symbolic link to a huge dependent library on an external drive. Or the audio interface needs to be attached before opening the DAW.

Executing such applications without meeting these requirements can mess up your settings and you may have to manually readjust preferences, paths, do cleanups, etc. Eventually data can get lost or overwritten.

It's too easy to forget that a device is not connected. This can be pretty annoying and is counterproductive to a creative workflow: An idea comes to your mind and you want to begin working on it immediately but then you're distracted by fixing up the mess caused by not having the proper device attached before opening the software.

My particular case

When I forget to connect the audio interface before I launch Logic Pro X it's going to use the system audio driver by default. Then I have to manually change the settings and make sure some things aren't altered like the sample rate, amongst other things.

Another case is when I open video or photo editing software without having an external disk connected where the library is stored. Then a new generic library will be created.

Prerequisites

With the following command it's possible to list all connected USB Devices. This is the first step for finding the audio interface.

# List all USB Devices
❯ ioreg -p IOUSB -w0 | sed 's/[^o]*o //; s/@.*$//' | grep -v '^Root.*'
Apple Internal Keyboard / Trackpad
BRCM20702 Hub
Bluetooth USB Host Controller
Duet USB

Then we can isolate the audio interface.

# Grep Duet USB Device
❯ ioreg -p IOUSB -w0 | sed 's/[^o]*o //; s/@.*$//' | grep -v '^Root.*' | grep "Duet USB"
Duet USB

The following command helps to identify if a volume named DATA is mounted.

# List external Disk
❯ mount | grep /Volumes/DATA
/Volumes/DATA

With this information we can write a function and set up an automatic workflow which meets our requirements.

Function

You can put this in your .zshrc/.bashrc/etc.

# Music workflow
music () {
    RED='\033[0;31m'
    NC='\033[0m' # No color
    if ioreg -p IOUSB -w0 | sed 's/[^o]*o //; s/@.*$//' | grep -v '^Root.*' | grep "Duet USB" > /dev/null && mount | grep /Volumes/DATA > /dev/null; then
        open /System/Library/PreferencePanes/Sound.prefPane
        open ~/Music/Sheet\ Music/;
        open /Applications/Logic\ Pro\ X.app/;
        open /Applications/Apogee\ Maestro\ 2.app/;
    else
        echo "Both ${RED}`DATA`${NC} and ${RED}`Duet USB`${NC} must be connected to proceed"
    fi
}

Description

The music function checks if both Duet USB and /Volumes/Data are attached. It either exits for False or proceeds to open the workflow.

The output for failing the requirements is:

❯ music
Both `DATA` and `Duet USB` must be connected to proceed.

Customize as needed. Variables can be: Duet USB, /Volumes/DATA, paths

System Setup

  • OS X 10.11 El Capitan
  • ZSH with .zshrc
  • USB audio interface
  • External disk