This post appeared originally in our sysadvent series and has been moved here following the discontinuation of the sysadvent microsite

So you are happily working in your shell issuing commands with merry abandon. At some point you typing in a long command, but find yourself in the wrong directory. Do you hit CTRL-c, then change directory for then to type in the entire command again?

Enter kill and yank

CTRL-a and CTRL-e

First some basics, CTRL-a will move the cursor to the start of the command line while CTRL-e will move the cursor to the end of the command prompt.

CTRL-k

Kill (CTRL-k) will remove the text after the cursor position and store it in a cut-buffer. If you move to the start of the prompt using CTRL-a, you will the remove the entire line of text, storing that in the cut buffer.

CTRL-y

When you need the text again, simply do a yank (CTRL-y) and the shell will copy out the text in the cut buffer into the command prompt. You can yank repeatedly, and you may access older entries in the yank buffer by pressing CTRL-y ESC-y ESC-y. (ALT-y may work, depending on your keyboard layout).

CTRL-r

Using arrows to search through history can get tedious. Thankfully, the bash devs have a solution for that as well. Pressing CTRL-r enters a reverse history search mode. Simply start typing in a search term and the shell will show the first sub-string match in reverse chronological order. At this point, pressing CTRL-r repeatedly will search further backwards.

Entered a really long one-liner … but realize you wrote “odne” instead of “done” in the middle? CTRL-r can help you with this as well, just hit CTRL-r odne <ESC> CTRL-f CTRL-t

CTRL-_

Use CTRL-underscore for undo. Unfortunately, it won’t help you recover from horrific errors in your previous command (i.e. rm’ing the wrong directory or shipping bitcoins to the wrong address), but if you find yourself frequently editing complex one-liners and changing your mind, “undo” may prove useful for you.

Alt-. and !$

Insert last argument of previous command. Say you type ls /var/tmp. If you as the next command type cd Alt-., the shell will insert /var/tmp into your command-line, resulting in cd /var/tmp. Repeated Alt-.’s will cycle backward in history.

While !$ is not a keybinding, you end up with the same result. But in this case, the shell will only substitute !$ with the last argument of the previous command only after you have pressed enter:

mkdir /var/tmp/foo
cd !$
cd /var/tmp/foo

Other bindings

Many of the tips here are Emacs keybindings - most other keybindings that works in Emacs will also work in shell - even macro definition and execution (CTRL-x(, CTRL-x), CTRL-xe). This is implemented through the ReadLine library, so most of those bindings will also be available in other programs using ReadLine.

Maybe you prefer vi bindings? Try set -o vi

Lars Olafsen

Technical Operations Manager at Redpill Linpro

Lars has been in the IT business for around two decades now, working initially both as a developer and systems administrator. He's been with Redpill Linpro for 9 years, and in addition to being one of our operations managers, he still gets the time to solder together pieces of code.

Just-Make-toolbox

make is a utility for automating builds. You specify the source and the build file and make will determine which file(s) have to be re-built. Using this functionality in make as an all-round tool for command running as well, is considered common practice. Yes, you could write Shell scripts for this instead and they would be probably equally good. But using make has its own charm (and gets you karma points).

Even this ... [continue reading]

Containerized Development Environment

Published on February 28, 2024

Ansible-runner

Published on February 27, 2024