The Two Character Config Hack That Changed my Bashing Life
20 Mar 2011
Code isn’t the only thing we should endeavor to keep DRY. Let’s see if you can detect a pattern in this very common — albeit contrived for sake of example — Bash session:
jerod@mbp:~$ cd src/erlang
jerod@mbp:~/src/erlang$ ls
[snip]
jerod@mbp:~/src/erlang$ cd ..
jerod@mbp:~/src$ ls
[snip]
jerod@mbp:~/src$ cd
jerod@mbp:~$ ls
[snip]
In my experience, the cd
command is almost always followed by the ls
command. Why have I been typing it in all these years? Not anymore, baby!
I already have a custom cd
function which provides cd ...
type directory traversals (more on that here), so I recently added two characters to it.
Before
function cd () {
if [[ $# > 0 ]]; then
if [ ${1:0:2} == ".." ]; then
rest=${1:2}
rest=${rest//./../}
builtin cd "${1:0:2}/${rest}"
else
builtin cd "$1"
fi
else
builtin cd
fi
}
After
function cd () {
if [[ $# > 0 ]]; then
if [ ${1:0:2} == ".." ]; then
rest=${1:2}
rest=${rest//./../}
builtin cd "${1:0:2}/${rest}"
else
builtin cd "$1"
fi
else
builtin cd
fi
ls
}
Did you spot the change? Yup, I just added the ls
at the end of every cd
. Little change, huge payoff. Give it a try and after a few days you’ll be wondering why you didn’t do this years ago (I know I am).
Oh, and if you don’t want the directory traversal bit, you can get away with a much more simple function:
function cd() { builtin cd $@ && ls; }
Enjoy!