15

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?
1
  • Try bind -p to list, so as help bind for other
    – Costas
    Commented Jan 16, 2016 at 12:53

2 Answers 2

26

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
3
  • 1
    @Sukminder No, Ctrl+S does stop output. You seem to be confusing it with Ctrl+Z. Commented Jan 16, 2016 at 21:20
  • See also: Emacs.
    – Erich
    Commented Aug 30, 2018 at 19:41
  • 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?
    – nyov
    Commented Aug 28, 2019 at 4:16
12

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.

5
  • @Sukminder, on FreeBSD, the POSIX -a option was added to stty.
    – RobertL
    Commented Jan 16, 2016 at 17:53
  • I've tried stty intr '^E' it works (sets) but temporarily and for current terminal/tty only. How do I change it globally & permanently?
    – Pandya
    Commented Jan 18, 2016 at 13:14
  • I think the best way would be to invoke stty in your $HOME/.profile or $HOME/.bashrc or some other shell startup initialization file.
    – RobertL
    Commented Jan 19, 2016 at 1:14
  • I've tried : it works with terminal but no effect in tty
    – Pandya
    Commented Jan 20, 2016 at 14:19
  • What did you try, what do you see, and what do you mean by tty? Maybe that could be a new question?
    – RobertL
    Commented Jan 20, 2016 at 19:09

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .