How does command-line tab completion work?

I’ve written a diary CLI program which lets me write a new entry or read an old entry. Here’s a simplified implementation:

#!/bin/bash
function usage {
  echo "usage: $(basename ${0}) write"
  echo "       $(basename ${0}) read <timestamp>"
  exit 1
}
case "${1}" in
  write )
    mkdir -p ~/diary
    nano ~/diary/"$(date '+%Y-%m-%d')"
    ;;
  read )
    if [ "${2}" = "" ]; then
      usage
    fi
    cat ~/diary/"${2}"
    ;;
  * )
    usage
    ;;
esac

This program prints its “usage” if the user gets it wrong:

$ mydiary
usage: mydiary write
       mydiary read <timestamp>
$ mydiary write
[nano opens for editing]
$ mydiary read
usage: mydiary write
       mydiary read <timestamp>
$ mydiary read 2018-01-14
Today I ate a crisp sandwich

But we can do better! With tab-completion, the user can see the possible commands without running them, and can complete the names of diary entries without typing them out fully.

WFH on lockdown, like me? Let’s help each other out! I just released Vidrio, a free app for macOS and Windows to make your screen-sharing awesomely holographic. “Oh damn that's genius”, said some YouTuber when he saw it. But don't believe him, or the #1 on Product Hunt. Instead, believe this demo:

With Vidrio

With generic competitor

More by Jim

Tagged . All content copyright James Fisher 2018. This post is not associated with my employer. Found an error? Edit this page.