Disclosure: This post includes affiliate links; I may receive compensation if you purchase products or services from the different links provided i...
For further actions, you may consider blocking this person and/or reporting abuse
One key I love in Bash and Zsh is meta-dot (or alt-period or escape-period). It is a bit like up arrow, but rather than replacing the curren line, it inserts the last word of the previous line. Pressing it multiple times cycles through multiple preceding lines.
For example, you just ran
somecommand > longfilename
and want to open the resulting file in vi, you can type
vi meta-dot
and
longfilename
will be inserted on your command line after vi.Whether you are in bash or zsh, you can use the
!
operator quite flexible:If we take:
echo a b c d
as an exampleWow, nice to know that, how do you type meta-dot? just literal?
Depends on your keyboard layout; most likely your meta key is "alt", so typing a period while holding down the alt key would do the trick. You can also type the escape key, followed by a period.
Within vim, you can more quickly switch back and forth between two files - buffers, technically - by ctrl-6. If you have more than two files, you can still switch between them by ":bn" where n is a buffer number. That's not slower than ctrl-z then "fg n".
Thx @Jing Xue, awesome tip for vim users.
Nice article. Personally, I feel that a lot of people can get a huge boost in shell productivity by installing oh-my-zsh and some nice plugins.
I'm also pro cobalt2 color scheme(not sure it really helps that much with productivity though)
@brendan , looks like a nice idea, but most of the time you don't have the luxury of those plugins on highly secure corporate infrastructure like on a big investment banks.
JavinPaul is true about this. On such an infrastructure you can' t have plugins installed and use them all around. Although I have got the option to use zsh I love the idea of using Ctrl + R.
The best useful thing I have found is the option to set aliases. You can have a cd into folder then run a program do a copy of the result and then return to the home folder. Just in one command.
This is a deal breaker for me that when I switch to a Windows environment I can't handle it.
Yes, technically you are correct, most of them are bash built-in. You also mentioned a couple of good points which I didn't know before, thx for adding value.
I don't know if it's just me but this article read really badly. It's not entirely clear what the actual commands are and your affiliate links all the way through really detract from the important stuff.
additions :
Use
nvim
andfzf
combinationOpen your mind to Neovim world.
use
rg
instead ofgrep
learning
rg
is easy and fruitful.use
zoxide
instead ofpushd
andpopd
zoxide is a legendary tool for the path jumping. Use it or lose it.
use aliases for your frequently used paths
use alisases for your config files
write your own functions for your workflow
learn regex if possible
regex is vital to programming, especially when working with long script files. Capturing the given regex can save you a huge amount of time.
learn parameters of your bash commands
instead of installing bunch of tools use your built-in tools effectively.
I keep a script that can run (with very minor changes, if any) across several of the "sh" based shells, including the original AT&T sh, ksh, zsh, and bash, though the newer shells now incorporate quite a bit of the functionality, so I've used them less frequently recently:
directory stack functions
declare -i DNUM=0
DLIST[DNUM]=
pwd
function g # go to a directory
{
if builtin cd "$@" >/dev/null && [ ${DLIST[DNUM]} != "$PWD" ]
then
DNUM=DNUM+1
DLIST[DNUM]=$PWD
fi
if DISPLAY exists, then set titlebar and icon.
}
function gb # go back
{
if (( $DNUM > 0 ))
then
DNUM=DNUM-1
fi
g ${DLIST[DNUM]}
}
function gn # go to selected (nth) dir
{
select DIR in
echo ${DLIST[*]} | tr " " "\012" | sort -u -y0
do
if [ "$DIR" ]
then
g $DIR
else
g $REPLY
fi
break
done
}
function up # go up n levels
{
declare -i levels
}
function addpath
{
PATH=$PATH:$1
echo $PATH
}
function todo
{
echo
date '+%D %H:%M'
>> ~/todoecho "$*" >> ~/todo
echo >> ~/todo
}
Main # <--- Main
Set the default directory and file protection mask. By default, do
not mask any protection on my ownership, but remove default write
access for the group, and do not give "world" any default access.
(I add or subtract various things, adding functions or procedures
that I am frequently using, and remove them when inappropriate
at a particular assignment. Sometimes I can send portions of a
script by Email; other times sending anything in is frowned upon
so I have to create bits and pieces of my personal tools manually).
export SHELL=~/bin/bash # usually my default shell
umask 022
OS=$(uname)
myterm=$(who am i)
myterm=$(echo $myterm | awk -F" " '{ print $2 }')
echo "The current HOST is $HOST"
echo "The current terminal is $myterm"
echo "The current shell is $SHELL"
return # get out of any functions I may be in
Finished .bashrc
Great collection of tips, I use the history grep a lot for not only finding what I need but also checking what I did to make sure that in the past I got it right :)
8 is something I still forget to do, which I blame on using those 'other' systems making me actually CD all the time.
Thanks for this.
@peter , history| grep is the holy grail, I learned a lot by doing just that and learning about what find, grep, and lsof options other teammates are using :-)
Hey nice list.. thanks for sharing it and encourage programmers to use terminal.
I want to share one that I use commonly:
$ grep -nHri 'string'
It searches case insensitive recursively on current dir and shows number of line and file of each occurence.
Hi, and thanks for the article! I love those shell short cuts. It makes working in it extremely fast and fun!
One meta point: Youāve added those equal signs to underline the headings, this actually looks very bad on mobile browsers or the dev.to app. Just open it on your phone. Would you mind removing them?
Thanks!
Thx @jan for pointing it out. I have removed them.
This is a massive one. You can:
history | grep git
To see all the things you were doing then:
!2177
it's a bit more keystrokes than āctrl+r allā to find a command but helps you reread what you did. So i mix these two often.
May sound captious but at the first glance, I thought that it would be perfect with the below
thx for suggestion included. And, no you are not captious, keep on suggesting :-)
sudo !!
is one of my favorite tricks in bash. It saves a lot of time!Not long ago I started using shell param expansion more and more and it is definitely a booster:
mv path/to/some/file/that/is/long/and/hard/to/type/{file,new_file_name}.txt
As bash and vi is preinstalled on corporate linux and modern cloud hosts i have āset -o viā in my profile to practice using vi keybindings day to day. I stick to bash as i cannot install other shells onto production hosts when firefighting outages. Using vi shortcuts in bash I can up arrow or ctrl+r to a line, hit esc to exit edit mode, and use vi keys to jump around and edit the line super fast. Then in an outage I can open configuration files in vi and know how to edited them very fast.
I think thats a good tip for new folks that being a rock star on your laptop using other shells and extensions that arenāt installed in production isnāt a transferable skill to ācattle not petsā cloud infra. Being a rockstar on your own laptop using exotic shells will wow your friends. Being a rockstar on a cloud vm during an outage using ancient tools and an empty profile will wow your team mates and the CTO.
I posted how to install git in bash inside visual studio code on windows which is how i stay sharp and ready to be a commandline ninja when trapped on a mandatory corporate windows laptop for day to day work.
I have lived an extreme example of this, when I had to fix a production outage by texting someone Linux commands.
Great article! If someone hasn't also suggested it, I suggest you look at fzf, which makes control-r a much better experience.
github.com/junegunn/fzf
I would also suggest oh-my-zsh which has a lot of plugins and tools that make your command line life easier.
github.com/robbyrussell/oh-my-zsh
FYI; I noticed you switch to egrep when splitting multiple matches with pipe; you can escape the pipe and stick with regular grep too:
mycommand | grep "string1\|string2"
Thx, I'll try thins, somehow I never used grep like that :-)
Try fish shell and don't worry about 1-4 š
Is that a real shell? never heard about that.
Try tcsh ..used it on everything from nextstep to irix to linux to Darwin today ..has the most creature comforts of any command line shell ..including many if not more of the ones mentioned :)
I used tcsh back in the day... zsh is better :)
ksh+vi mode, far fewer keystrokes and more intuitive cli navigation. Bash's vi mode, an improvement - but but not as effeciently.
CTRL+R ftw! I didn't know about this one for the longest time. I use it every day now! Saves so much time and seems to be the fastest of all the history oriented commands you listed here
Great article! š
You should check out this Open-Source Introduction to Bash Scripting Ebook on GitHub as well!
Cool Tips! I especially like tips # 1-3 & 8. Thanks for sharing!
As Iām interested in finding out how you are using this features . Kerala Vasiyam Specialist in Trichy