Skip to content

Instantly share code, notes, and snippets.

@tuxfight3r
Last active December 28, 2024 06:44
Show Gist options
  • Save tuxfight3r/60051ac67c5f0445efee to your computer and use it in GitHub Desktop.
Save tuxfight3r/60051ac67c5f0445efee to your computer and use it in GitHub Desktop.
Bash keyboard shortcuts

Bash Shortcuts

visual cheetsheet

Moving

command description
ctrl + a Goto BEGINNING of command line
ctrl + e Goto END of command line
ctrl + b move back one character
ctrl + f move forward one character
alt + f move cursor FORWARD one word
alt + b move cursor BACK one word
ctrl + xx Toggle between the start of line and current cursor position
ctrl + ] + x Where x is any character, moves the cursor forward to the next occurance of x
alt + ctrl + ] + x Where x is any character, moves the cursor backwards to the previous occurance of x

Edit / Other

command description
ctrl + d Delete the character under the cursor
ctrl + h Delete the previous character before cursor
ctrl + u Clear all / cut BEFORE cursor
ctrl + k Clear all / cut AFTER cursor
ctrl + w delete the word BEFORE the cursor
alt + d delete the word FROM the cursor
ctrl + y paste (if you used a previous command to delete)
ctrl + i command completion like Tab
ctrl + l Clear the screen (same as clear command)
ctrl + c kill whatever is running
ctrl + d Exit shell (same as exit command when cursor line is empty)
ctrl + z Place current process in background
ctrl + _ Undo
ctrl + x ctrl + u Undo the last changes. ctrl+ _ does the same
ctrl + t Swap the last two characters before the cursor
esc + t Swap last two words before the cursor
alt + t swap current word with previous
esc + .
esc + _
alt + [Backspace] delete PREVIOUS word
alt + < Move to the first line in the history
alt + > Move to the end of the input history, i.e., the line currently being entered
alt + ? display the file/folder names in the current path as help
alt + * print all the file/folder names in the current path as parameter
alt + . print the LAST ARGUMENT (ie "vim file1.txt file2.txt" will yield "file2.txt")
alt + c capitalize the first character 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 + n
alt + p Non-incremental reverse search of history.
alt + r Undo all changes to the line
alt + ctl + e Expand command line.
~[TAB][TAB] List all users
$[TAB][TAB] List all system variables
@[TAB][TAB] List all entries in your /etc/hosts file
[TAB] Auto complete
cd - change to PREVIOUS working directory

History

command description
ctrl + r Search backward starting at the current line and moving 'up' through the history as necessary
crtl + s Search forward starting at the current line and moving 'down' through the history as necessary
ctrl + p Fetch the previous command from the history list, moving back in the list (same as up arrow)
ctrl + n Fetch the next command from the history list, moving forward in the list (same as down arrow)
ctrl + o Execute the command found via Ctrl+r or Ctrl+s
ctrl + g Escape from history searching mode
!! Run PREVIOUS command (ie sudo !!)
!vi Run PREVIOUS command that BEGINS with vi
!vi:p Print previously run command that BEGINS with vi
!n Execute nth command in history
!$ Last argument of last command
!^ First argument of last command
^abc^xyz Replace first occurance of abc with xyz in last command and execute it

Kill a job

n = job number, to list jobs, run jobs

kill %n

Example:

kill %1

References

  1. http://cnswww.cns.cwru.edu/php/chet/readline/readline.html
  2. https://github.com/fliptheweb/bash-shortcuts-cheat-sheet/blob/master/README.md
@SonkeWohler
Copy link

@MichaelMai2000

edit: I have managed to get the first key bind, first press ctrl and hold, then press ], release both, and finally press x. But when I copy the pattern of this, "ctrl+alt+] followed by x" will just insert x without moving the cursor at all.

It works fine on my system. Like you said, press and hold ctrl, alt, and ] at the same time, then let them all go, then press x.

I used to try to use [ instead of ] when searching backwards, probably because that is how vim tends to set things up and I just didn't notice I was doing it wrong.

I know WSL sometimes has problems, but the fact that you got the forward working tells me stuff is set up correctly for you (~/.inputrc is usually where this stuff is defined), so probably human error just like me.

@chinyu0704
Copy link

thanks

@doroshenkoSaac
Copy link

Thanks bro!

@sudofox
Copy link

sudofox commented Apr 7, 2023

would you be able to add a white outline on the top image so i can see it on github's dark mode?

@gitressa
Copy link

gitressa commented Jun 2, 2023

Great list, thanks! I have been wanting to delete the word FROM the cursor and learning about alt + d is very helpful.

Moving back or forward one word either with ctrl or alt key and arrow keys is possible, I believe. Should this be added?

command description
alt + f move cursor FORWARD one word (same as alt + right arrow or ctrl + right arrow)
alt + b move cursor BACK one word (same as alt + left arrow or ctrl + left arrow)

Also, it may be helpful to know that shift + ctrl + v pastes from clipboard, and ctrl + y pastes from the cut-buffer, at least in Ubuntu. An example:

  • Create this string: 111 222
  • Highlight 111 and copy it with shift + ctrl + c
  • Place the cursor before 222 and press alt + d to cut it
  • Press shift + ctrl + v and ctrl + y repeatedly, and get 111222111222111222111222

@SonkeWohler
Copy link

@gitressa

Also, it may be helpful to know that ctrl + v pastes from clipboard, and ctrl + y pastes from the cut-buffer. An example:

  • Create this string: 111 222
  • Highlight 111 and copy it with ctrl + c (or ctrl + shift + c)
  • Place the cursor before 222 and press alt + d to cut it
  • Press ctrl + v and ctrl + y repeatedly, and get 111222111222111222111222

That behaviour of ctrl + v is not part of bash but of your terminal emulator (Kitty, Alacritty, etc), which captures it and sends your system clipboard contents instead. In pure bash ctrl + v will insert the next "character" you type literally, e.g. ctrl + v followed by backspace inserts ^?, ctrl + v followed by enter inserts ^M.

Similarly for ctrl + c it would send an interrupt, but your emulator captures it first and copies to system clipboard instead.

ctrl + y is bash internal, hence why it comes up in this list. As such, though, it doesn't have access to your system clipboard, it is entirely separate. Hence the behaviour you describe with both clipboards having different contents.

When your emulator is not setup to overwrite ctrl + v you can usually still insert with shift + insert. Many emulators also use ctrl + shift + v or more rarely some combination with space.

@gitressa
Copy link

gitressa commented Jun 3, 2023

Thanks for clarifying. I use Ubuntu, and forgot that I have changed the classic "paste from clipboard" from shift + ctrl +v to ctrl + v, so I have updated my post, to use the standard shortcut (shift + ctrl +v) and also added that this is in Ubuntu. Sorry things got mixed up in my first version.

@DSc-de
Copy link

DSc-de commented Jun 23, 2023

Ctrl + s isn't reverse search, it's basically for 'pausing the tty'. Ctrl+q is for resuming said pause.

In that case most likely the underlying OS terminal device receives and interprets the shortcut. stty can be used to disable, e.g. stty -ixon. After disabling it on my GNOME terminal, expected history search is started on Ctrl + s . For more information see https://unix.stackexchange.com/questions/12107/how-to-unfreeze-after-accidentally-pressing-ctrl-s-in-a-terminal

@idimitroie
Copy link

idimitroie commented Jan 2, 2024

Hi,
I am very impressed, how did you make the figure?
Latex?

@busfahrer
Copy link

busfahrer commented Jan 4, 2024

Great list, I learned a lot.

One thing I would add:
In addition to !n (which runs the history entry n), you can also do !-n which runs the n-th previous command, e.g. !-2 would run the command that preceded your last command.

@jzk
Copy link

jzk commented Mar 17, 2024

Great list, I learned a lot.

One thing I would add: In addition to !n (which runs the history entry n), you can also do !-n which runs the n-th previous command, e.g. !-2 would run the command that preceded your last command.

good to learn that! but isn't pressing up twice easier?

@Eslam-Farg
Copy link

How to discard the current command (not executed yet) and move to a new line without printing anything or deleting the current line?
use case: if I need to copy that line and use it later after executing other commands.

@mamad-1999
Copy link

How to discard the current command (not executed yet) and move to a new line without printing anything or deleting the current line? use case: if I need to copy that line and use it later after executing other commands.

You can discard the current command without executing it and move to a new line by using the keyboard shortcut Ctrl+U. This clears the current line but saves it in a buffer, allowing you to paste it back later with Ctrl+Y.

@NTR0314
Copy link

NTR0314 commented Jul 4, 2024

What I find quite confusing is that CTRL + w and ALT + d are not exact opposites of each other.
CTRL + W will delete a space seperated word like word_num_1 word_num_2, while
ALT + d will only delete until the underscores. I wondering if it is configurable that ALT + d behaves the same as CTRL + W or if there is an inbuilt alternative?

EDIT: By consulting with an LLM apparently there is ALT + Backspace and Escape + Backspace which have the desired properties.
Additionally one can use custom bindings to remap stuff.

@Peak2708
Copy link

Peak2708 commented Jul 24, 2024

how to go to the next line? i mean whenever i type cat>a.txt and then write a message on next line after i hit enter new plain line starts but i need next command line

@NTR0314
Copy link

NTR0314 commented Jul 24, 2024

You can use \ at the end of the line to do multi-line commands @Peak2708

@Eslam-Farg You could use CTRL + a to move the beginning of the line and prepend a "#" to make it a comment and execute it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment