Update 2/18/18 – add some handy alt shortcuts
Bash is great. As I have discovered over the years, Bash contains many different layers, like a good movie or a fine wine. It is fun to explore and expose these different layers and find uses for them. As my experience level has increased, I have (slowly) uncovered a number of these features of Bash that make life easier and worked to incorporate them in different ways into my own workflows and use them within my own style.
The great thing about fine arts, Bash included, is that there are so many nuances and for Bash, a huge number of features and uses, which makes the learning process that much more fun.
It does take a lot of time and practice to get used to the syntax and to become effective with these shortcuts. I use this page as a reference whenever I think of something that sounds like it would be useful and could save time in a script or a command. At first, it may take more time to look up how to use these shortcuts, but eventually, with practice and drilling will become second nature and become real time savers.
Navigating the Bash shell is easy to do. But it takes time to learn how to do well. Below are a number of shortcuts that make the navigation process much more efficient. I use nearly all of the shortcuts daily (except Ctrl + t and Ctrl + xx, which I only recently discovered). In a similar vein, I wrote a separate post long ago about setting up CLI shortcuts on iterm that can further augment the capabilities of the CLI.
- Ctrl + a => Return to the start of the command you’re typing
- Ctrl + e => Go to the end of the command you’re typing
- Ctrl + u => Cut everything before the cursor to a special clipboard
- Ctrl + k => Cut everything after the cursor to a special clipboard
- Ctrl + y => Paste from the special clipboard that Ctrl + u and Ctrl + k save their data to
- Ctrl + t => Swap the two characters before the cursor (you can actually use this to transport a character from the left to the right, try it!)
- Ctrl + w => Delete the word / argument left of the cursor
- Ctrl + l => Clear the screen
- Ctrl + _ => Undo previous key press
- Ctrl + xx => Toggle between current position and the start of the line
There are some nice Alt key shortcuts in Linux as well. You can map the alt key in OSX pretty easily to unlock these shortcuts.
- Alt + l => Uncapitalize the next word that the cursor is under (If the cursor is in the middle of the the word it will capitalize the last half of the word).
- Alt + u => Capitalize the word that the cursor is under
- Alt + t => Swap words or arguments that the cursor is under with the previous
- Alt + . => Paste the last word of the previous command
- Alt + b => Move backward one word
- Alt + f => Move forward one word
- Alt + r => Undo any changes that have been done to the current command
Argument tricks can help to grow the navigation capabilities that Bash shortcuts provide and can even further speed up your effectiveness in the terminal. Below is a list of special arguments that can be passed to any command that can be expanded into various commands.
- !! => Repeat the previous (full) command
- !foo => Repeat the most recent command that starts with ‘foo‘ (e.g. !ls)
- !^ => Repeat the first argument of the previous command
- !$ => Repeat the last argument of the previous command
- !* => Repeat all arguments of last command
- !:<number> => Repeat a specifically positioned argument
- !:1-2 => Repeat a range of arguments
- !$:p => Print out the word that !$ would substitute
- !*:p => Print out the previous command except for the last word
- !foo:p =>Print out the command that !foo would run
When writing scripts , there are a number of special parameters you can feed into the shell. This can be convenient for doing lots of different things in scripts. Part of the fun of writing scripts and automating things is discovering creative ways to fit together the various pieces of the puzzle in elegant ways. The “special” parameters listed below can be seen as pieces of the puzzle, and can be very powerful building blocks in your scripts.
- $* => Expand parameters. Expands to a single word for each parameter separated by IFS delimeter – think spaces
- $@ => Expand parameters. Each parameter expand to a separate word, enclosed by “” – think arrays
- $# => Expand the number of parameters of a command
- $? => Expand the exit status of the previous command
- $$ => Expand the pid of the shell
- $! => Expand the pid of the most recent command
- $0 => Expand the name of the shell or script
- $_ => Expand the last previous argument
There are some many crevices and cracks of Bash to explore, I keep finding new and interesting things about Bash that lead down new paths and help my skills grow. I hope some of these tricks give you some ideas that can help and improve your own Bash style and workflows in the future.