Command line adventures
25 June 2020I recently experimented with spending as much time as possible in the command line. It turns out you can do a lot without leaving the shell. But how far is too far?
Given that I use Vim as a code editor, I’m already quite comfortable with spending a lot of my working hours looking at a terminal. I tend to work with split pane views in iTerm where I code, run tests, use version control, among other things.
So far, these tasks had been mainly related to building software. But because I wanted to feel more at home with Unix-like shells, I wanted to try and achieve more tasks via CLI.
Baby steps
I started nice and easy. I ditched Postman for
curl
wrapped in a custom function optimised for JSON:
jurl () {
curl -LSs -H "Accept: application/json" -H "Content-Type: application/json" "$@" | jq .
}
That was fun. I found that finding previous API calls I had made was much
easier using reverse-i-search
than trying to find one in dozen open tabs in
Postman.
I could reverse search by header, domain, path, method, pretty much anything.
This proved to be a positive experience, so I went further.
Scripting
Besides the jurl
function I wrote to simplify JSON requests, I tried other
aliases, functions and even whole shell scripts to automate repetitive tasks.
This taught me a lot. Shell script is an interesting world. I found out about
set -euxo pipefail
. Game changer. Thanks to
Tom for
his helpful article on the topic.
This carried over into my professional life too. I added and improved previous shell scripts we used for testing, running migrations and deploying.
Communication and scheduling tools
I think this is where I went too far. The company I work for uses Asana for project management, Slack for messaging and Google Calendar for… well, calendars.
I tried to move all of these to the command line. Where I couldn’t find an
alternative, I tried using these tools via email, which would allow me to “use”
them via a TUI email client like mutt
.
It was worth a try, and maybe I didn’t try it for long enough, but this is where I think my limit was. I didn’t notice an increase in productivity, focus, or any other benefit. I lost rich visual features like colours and threads, and input methods like drag and drop.
I quickly reverted back to the 21st century.
What I learnt
The Unix philosophy is awesome
It just continues to impress me. Everything can be piped into everything else, pretty much.
Combining different programs (e.g. grep
, awk
, sed
) that do one thing
extremely well is super powerful. Software engineers should take advantage of
these tools.
Code is just fancy text
Taking notes in Vim is so much faster, tidy and friction-free. If I’m coding
and have a thought or want to jot a quick to-do, just :tabe note
it and
forget it.
Not everything is better
I tried to use mutt
and aerc
to read and compose email, but it’s just not for me. Same goes with
terminal-based calendars.
It makes sense to stay within the same context (your terminal) when doing related things (coding). It’s okay and perhaps desirable to context-switch to another environment (your web browser) for other tasks.
I’m happy coding, thinking and producing in the terminal. I’m also happy communicating, collaborating and cleaning my inbox on Firefox.
Final thoughts
Artificially “restricting” yourself to the terminal is definitely a good idea
if you’re trying to be more comfortable ssh
ing into servers or just using
powerful Unix programs. I recommend the experience to anyone.
But it’s not and should not be an absolute, and we risk losing productivity (and fun!) if we try to shoehorn all tasks into it.
You gotta have some HTML in life!