•
Brian Ketelsen
This bash setup is the latest evolution of my quest to make a new system install as fast as possible.
I've created a bash
function that enables quick software installs without being as heavy as something like ansible
. The system relies on a single function in my bashrc
and a directory full of bash scripts. Let's dive in and see how it works.
In my dotfiles directory, which is stored at ~/dotfiles
there's a subdirectory called install
. That directory contains a few dozen bash scripts that install the various software components and packages I might use. Some of them are needed on all the computers I use, some of them are used only infrequently for certain projects. Here's an example that installs Go:
❯ go.sh
#! /bin/bash
set -e
VERSION=1.15
# Delete existing Go installation
sudo rm -rf /usr/local/go
# Install Go in /usr/local
sudo mkdir -p /usr/local/go && curl -Ls https://storage.googleapis.com/golang/go$VERSION.linux-amd64.tar.gz | sudo tar xvzf - -C /usr/local/go --strip-components=1
The script declares a VERSION
variable so I can change the version to be installed when there's a new release of Go. Then it deletes the existing Go installation and replaces it with a freshly downloaded version. Because it deletes the existing install and replaces it, it can be run more than once with no unwanted side-effects. I've attempted to make all my scripts idempotent like this, but some of them just aren't because my bash skills are just mediocre.
To use these installation scripts I've created a bash function that searches for scripts in the ~/dotfiles/install
folder matching the first argument of the function:
inst() {
if [ -f $HOME/dotfiles/install/$1.sh ] ; then
echo Installing $1
. $HOME/dotfiles/install/$1.sh
else
echo $1 not found
fi
}
To install Go using this function I would type $> inst go
, which would search for a script called ~/dotfiles/install/go.sh
and execute it if it exists. It's not complicated, and only took a few minutes to write the function, but I'm getting a lot of ROI on the time I spend writing installation scripts. When I spin up a new VM somewhere, I can quickly clone my dotfiles and install just the bits I need for a particular task.
I've been playing with direnv
integrations to make the installation of required tools or commands automatic when entering a project directory. I haven't found anything yet that doesn't feel too "hacky", so I haven't finished this part.
In the future I may extend the script to search for installation scripts with an arch
component in the file path, like ~/dotfiles/install/linux/go.sh
or ~/dotfiles/install/macos/go.sh
. I don't have a need for this right now because I'm not using my Mac for development work.
I may also consider making meta
scripts that call others. It might be similar to installing a Development metapackage, where the metapackage simply calls the other packages it wants to wrap.