Command-line Interface Articles

Wait for open port before running command

There comes a time in every software engineer’s life, when they need to run a command, but only after a port has been opened by a completely separate process. Sure, you could sit around and wait for the port to open up before running your command, but what’s the fun […]

Enabling and disabling unattended upgrades on Debian and Ubuntu

The unattended-upgrades package on Debian is absolutely fantastic. It takes cares of the stable packages that can be installed safely automatically, leaving you with fewer manual upgrades that you have to deal with yourself. Sadly though, I ran into an issue recently where the unattended-upgrades script was running in the […]

Key is stored in legacy trusted.gpg keyring

One of the more noticeable things to come out of me switching from Arch Linux back over to Debian, is that I’m rarely running into any issues. Because I’m not running into any weirdness, it’s been at a detriment to my blog, as my time on Arch was a constant […]

Node.js REPL history

Node.js has included a persistent history with it’s REPL (real-eval-print loop) for quite some time now. It’s a fantastic quality of life feature, and it even supports reverse-i-search. The other day, I got to wondering, where the heck does this history even live? Turns out, it’s just living in a […]

Show hidden files with tree

The tree command is one of my favorites. As the name of the command suggests, it simply lists the contents of a directory in a tree-like format. Think of it like ls *, which outputs the contents of each directory, but instead of a flat list, the files are shown […]

Reinstalling packages on Debian and Ubuntu

My recent migration from Arch Linux to Debian (testing) has been an extremely smooth one, but not without it’s issues. A small issue I ran into early on was a problem with totem, the video app, crapping out. While I’m not sure exactly what the heck went wrong, the quick […]

Generating lowercase UUIDs with uuidgen on macOS

The implementation of uuidgen on Linux returns all lowercase letters by default. The implementation of uuidgen on macOS returns all uppercase letters by default. This triggers the hell out of me, by default. Usually when I approach consistency between macOS and Linux, both of which I use daily, I will […]

How to search for installable packages on Debian

The thing that I miss most of all since moving from Arch Linux back over to Debian is the Arch User Repository (AUR). Every package I ever needed was there, sometimes multiple times based on different forks that folks were maintaining. Even without the AUR, Debian has a massive number […]

Using multiple profiles with aws-cli

One of the best aspects of Amazon Web Services (AWS) is that a full featured command-line utility exists for it. If you’ve ever spent a decent amount of time in the AWS Console (their web interface) then you understand why this is a good thing. As you venture into better […]

How to use an SSH tunnel to forward ports

Security is important. Bastion hosts (or jump servers) are an easy way to wall off your private servers from the outside world. Improved security is always a good thing, but it isn’t always convenient. With a bastion host in place, you shouldn’t be able to connect directly to a private […]

Execute command in timed intervals

Running a command (script, program, et cetera) on a regularly timed interval can be accomplished a few different ways. One way, is to leverage the crontab utility, which schedules runs to run one or more times per day. While a fantastic utility, crontab can be a bit heavy at times, […]

How to run a command after changing directories in zsh

About once a year or so, I go through my dotfiles and do some clean up. Usually around spring time, but also, usually after I discover some new hotness that I had not known about that I want to leverage. This year, it’s both. Spring is nearly in the air, […]

Reattaching to a still attached GNU Screen session

While tmux is my daily driver for local terminal multiplexing, I still use GNU screen when I’m working on remote servers. The primary reason for this is to avoid nesting tmux sessions. I can use tmux locally, ssh to a remote server, start up a screen session and I’m off […]

Associative arrays in Bash

Arrays, both indexed and associative are a powerful and versatile data type, regardless of the language you’re utilizing them in. At one point in Bash’s history, pre-version 4.0, Bash only had indexed arrays. These indexed arrays were defined as such: # Initialize an array with values arr=("first" "second" "third") # […]

Monitoring the progress of dd

Whether you’re zeroing out an old disk drive or creating a USB flash drive with your favorite Linux distro, dd is there to take care of business. One of the shortcomings of using dd back in the day was the lack of transparency into what it was actually doing and […]

How to push an empty git commit

We’ve all been there. We need to trigger something from a commit to a git repository, and instead of triggering the build directly, we end up tweaking something in a file, committing it, and pushing it. It’s usually just adding a blank line (and subsequently removing it, depending on where […]

Migrating from aws ecr get-login to aws ecr get-login-password

I’m not entirely sure when the change happens, but recently as I was upgrading AWS CodeBuilds to use a newer version of Ubuntu, I ran into some problems with aws ecr get-login. Without making any code changes, my build started to fail with the following: [Container] 2021/06/21 20:44:19 Running command […]

Using find with symbolic links

Symbolic links, or symlinks come in handy when you need to share directories with multiple directories and not have to worry about keeping each linked instance in sync. The problem with symlinks is that not every command-line utility supports them, and often times, they do support them, but it’s not […]

How to push to multiple git repos at once

A while back I fell in love with GitLab, specifically their GitLab Runners. This was at a time before GitHub had GitHub Actions, so I decided to move the majority of my git repositories over to GitLab. Fast forward a few years, GitHub has Actions, and more importantly, it seems […]

Run command instead of alias

Recently, a buddy of mine was having some issues with Homebrew after upgrading to Big Sur. After doing the Googling he could have done on his own, I came to realize that he needed to manually upgrade to the latest version, that was compatible with Big Sur. He said he […]

Case statements in shell script

While I do love the command-line, and will throw shell script at most problems if it’s the right tool for the job, it’s actually fairly rare that I write case statements. Generally speaking, my shell scripts will usually interrogate a variable or two, never too crazy or anything. With that, […]

Delete all files in an S3 bucket

Last year I had sunset a project that was using both AWS’ S3 and Linode’s S3-compatible object storage offering. After pulling down some final snapshots, I wanted to delete the buckets on both services. Similar to the error you receive when you attempt to rmdir a directory with files in […]

Search and replace filenames

Recently, while working with a bunch of files, I came to realize that I needed to rename every single file. Not just that, I only needed to rename a small bit of the filename. If I was working with a document, I wound have leveraged a “search and replace” feature, […]

Counting files in multiple directories

Last week I discussed counting files in the current directory. It was a quick and dirty way to get the number of files in a directory with some pretty strong assumptions about the type of files / directories that your current directory contained. Sure, it was a short sighted in […]

Counting files in the current directory

As the year comes to a close, I like to look back and see how many blog posts I have written for the year. My blog is powered by Jekyll and I like to keep my posts organized by year, in directories. With all of my posts in one place, […]