It’s happening again. I’ve grown a bit tired of Debian, and have started to long for all the bleeding edge glory that is Arch. As this is a semi-frequent occurrence in my life, I’ve gotten pretty good at juggling distributions within my shell scripts, specifically in my dotfiles.
Since each system has it’s own little nuance way to do certain things, I’ve had to implement conditionals that check which system I’m on. The Node.js Version Manager nvm
is a great example of this, as it’s shell scripts that you need to source from your shell profile get installed to wildly different places.
Debian, Arch, as well as macOS all have to be accounted for, as I jump between those systems on the regular.
Sadly, you can’t simply rely on uname
for anything other than macOS, as it simply returns Linux
regardless which Linux distribution you’re on. The solution? Check to see if the distro’s package manager du jour is available.
If it’s available, there is a good chance you’re on that distro. While not a 100% guarantee, I’ve yet to run into any problems with this method, so it’s as close to perfect as I need it to be.
Here’s what a conditional handling macOS, Debian and Arch looks like:
if [[ `uname` == Darwin ]]; then
# Do the macOS stuff...
elif command -v apt &> /dev/null; then
# Do the Debian stuff...
elif command -v pacman &> /dev/null; then
# Do the Arch stuff...
else
# You could error when encountering an "unknown" system, perhaps...
fi
PHPObviously detecting apt
could also mean it’s an Ubuntu system, but this really
only matters if a) I ran Ubuntu, and b) if Ubuntu had some deviation from Debian.
You could expand this as you see fit as well, including checks for Red Hat,
Gentoo, Alpine, and the like.