What are the keyboard shortcuts for the command-line?

26,074

Solution 1

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.

Solution 2

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
Share:
26,074

Related videos on Youtube

Pandya
Author by

Pandya

I use PureOS on old Desktop Computer and Debian GNU/Linux on my Laptop. I want to switch to Guix in future! You may read my Computing History in this meta post :) I recommend visiting Philosophy of GNU Project.

Updated on September 18, 2022

Comments

  • Pandya
    Pandya almost 2 years

    I'm talking about the keyboard shortcuts that you use in command-line/terminal.

    Example: Ctrl+c that kills the process, Ctrl+d that logout, Ctrl+z that send process to background... etc.

    I've tested some and found that they are neither terminal (i.e gnome-terminal, xterm, konsole) specific nor shell (i.e bash, zsh) specific, they even work at ttys.

    So, I want to know:

    • Who provides these shortcuts?
    • How can I list and modify/define them?
    • Costas
      Costas over 8 years
      Try bind -p to list, so as help bind for other
  • RobertL
    RobertL over 8 years
    @Sukminder, on FreeBSD, the POSIX -a option was added to stty.
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' over 8 years
    @Sukminder No, Ctrl+S does stop output. You seem to be confusing it with Ctrl+Z.
  • Pandya
    Pandya over 8 years
    I've tried stty intr '^E' it works (sets) but temporarily and for current terminal/tty only. How do I change it globally & permanently?
  • RobertL
    RobertL over 8 years
    I think the best way would be to invoke stty in your $HOME/.profile or $HOME/.bashrc or some other shell startup initialization file.
  • Pandya
    Pandya over 8 years
    I've tried : it works with terminal but no effect in tty
  • RobertL
    RobertL over 8 years
    What did you try, what do you see, and what do you mean by tty? Maybe that could be a new question?
  • Erich
    Erich almost 6 years
    See also: Emacs.
  • nyov
    nyov almost 5 years
    Nice! And is there a way to reach the ^U, that stty -a shows defined for SIGKILL on Linux, from bash? Preferrably without undefining the readline stuff (perhaps through a third mod/meta key). I assume it is only shadowed by the ctrl+u readline binding?