What are the keyboard shortcuts for the command-line?

From http://www.skorks.com/2009/09/bash-shortcuts-for-maximum-productivity/

Command Editing Shortcuts

  • Ctrl+a – go to the start of the command line
  • Ctrl+e – go to the end of the command line
  • Ctrl+k – delete from cursor to the end of the command line
  • Ctrl+u – delete from cursor to the start of the command line
  • Ctrl+w – delete from cursor to start of word (i.e. delete backwards one word)
  • Ctrl+y – paste word or text that was cut using one of the deletion shortcuts (such as the one above) after the cursor
  • Ctrl+xx – move between start of command line and current cursor position (and back again)
  • Alt+b – move backward one word (or go to start of word the cursor is currently on)
  • Alt+f – move forward one word (or go to end of word the cursor is currently on)
  • Alt+d – delete to end of word starting at cursor (whole word if cursor is at the beginning of word)
  • Alt+c – capitalize to end of word starting at cursor (whole word if cursor is at the beginning of word)
  • Alt+u – make uppercase from cursor to end of word
  • Alt+l – make lowercase from cursor to end of word
  • Alt+t – swap current word with previous
  • Ctrl+f – move forward one character
  • Ctrl+b – move backward one character
  • Ctrl+d – delete character under the cursor
  • Ctrl+h – delete character before the cursor
  • Ctrl+t – swap character under cursor with the previous one

Command Recall Shortcuts

  • Ctrl+r – search the history backwards
  • Ctrl+g – escape from history searching mode
  • Ctrl+p – previous command in history (i.e. walk back through the command history)
  • Ctrl+n – next command in history (i.e. walk forward through the command history)
  • Alt+. – use the last word of the previous command

Command Control Shortcuts

  • Ctrl+l – clear the screen
  • Ctrl+s – stops the output to the screen (for long running verbose command)
  • Ctrl+q – allow output to the screen (if previously stopped using command above)
  • Ctrl+c – terminate the command
  • Ctrl+z – suspend/stop the command

Bash Bang (!) Commands

Bash also has some handy features that use the ! (bang) to allow you to do some funky stuff with bash commands.

  • !! – run last command
  • !blah – run the most recent command that starts with ‘blah’ (e.g. !ls)
  • !blah:p – print out the command that !blah would run (also adds it as the latest command in the command history)
  • !$ – the last word of the previous command (same as Alt + .)
  • !$:p – print out the word that !$ would substitute
  • !* – the previous command except for the last word (e.g. if you type ‘find some_file.txt /‘, then !* would give you ‘find some_file.txt‘)
  • !*:p – print out what !* would substitute

The kernel's terminal driver (termios) interprets the special keys that can be typed to send a signal to a process, send end of file, erase characters, etc. This is basic Unix kernel functionality and very similar on most Unix and Linux implementations.

The stty command displays or sets the termios special characters, as well as other parameters for the terminal line driver.

Invoke stty -a to see the current values of the special characters and other "terminal line settings". In the following examples, you can see that intr is Ctrl+C, eof is Ctrl+D, susp is Ctrl+Z. (I've deleted other output to show only the special character settings):

stty -a special chars on GNU/Linux:

intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;

stty -a special characters on FreeBSD:

cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ^@; eol2 = ^@;
        erase = ^?; erase2 = ^H; intr = ^C; kill = ^U; lnext = ^V;
        min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
        stop = ^S; susp = ^Z; time = 0; werase = ^W;

To change the value of a special character, for example, to change the interrupt character from Ctrl+C to Ctrl+E invoke stty like this (^E is literally two characters, the circumflex (^) followed by the letter E):

stty intr '^E'

For more information see the man pages for stty and termios. On GNU/Linux you can also look at the tty_ioctl man page.

Notes:

The intr key (Ctrl+C by default), doesn't actually kill the process, but causes the kernel to send an interrupt signal (SIGINT) to all processes within the process group. The processes may arrange to catch or ignore the signal, but most processes will terminate, which is the default behavior.

The reason that Ctrl+d logs you out is because the terminal line driver sends EOF (end of file) on the standard input of the shell. The shell exits when it receives end of file on it's standard input.