Mastering the Command Line

Nov 4, 2022

The command line might seem daunting for new (and old) developers, but another unlock for developer productivity — if you can master it. A crash course syllabus that will get you 80% there (Pareto principle).

The caveat is that “the command line” means a lot of things. To be more specific, these are UNIX-y, bash, and popular terminal emulator tricks. This is not a list of complex one-liners that you can alias and never remember what they do. It's a hopefully practical list of things you can learn and remember.

Reverse-i-search ctrl+RFuzzy searches through past commands. Add shift to go back a selection. Jump around text with Emacs-style key bindings that generally work in bash-like shells — ctrl+a to jump to the end of the line, ctrl+e to the end. Clear the screen with ctrl+l (or cmd+K on macOS).

Unix pipes, stdin/stdout, redirection — Thinking in terms of stdin/stdout and pipes is the key to navigating the command line. Pipes pass the output (stdout) of one command as input (stdin) to another. Redirection > to a file. Append >> to a file. You can also redirect stdout/stderr to a file or file descriptor, but either memorize those commands 2>&1 or look them up when you need them.

.ssh/config — You can specify all the command line inputs so you can connect more quickly. For example, matching a domain or subnet Host *.amazonaws.com, 10.2.* or even encoding long port forwarding commands LocalForward 5432 database.com:5432

  • time before a command measures the execution time
  • ls -lh for listing human-readable file sizes. Sometimes mnemonics are good for remembering command arg combinations – ls -thor or ps -aux.
  • mv filename.{old,new} is a bit quicker and less error-prone
  • macOS – open . opens finder in that folder, pbcopy and pbpaste give you access to the clipboard.
  • You probably don't want to background a task, but if you do have to – & will free up the terminal while continuing to write to stdout. List jobs with jobs and bring them back with fg. You can also write to a file with nohup <process> &. Your intuition might be to background a process, but that's usually the wrong solution.