For my first bash script, I want to create something that's really been annoying me: when I switch folders, I want the contents of that folder to be displated automatically. I tried adding this following code to ~/.bashrc:

alias go='cd; ls'

Simple enough I thought! Not so. While typing go /etc does indeed list the contents of /etc, my working directory hasn't actually changed, I'm still in the one I was in before. How do I remedy this?


In your example, go /etc will do cd; ls /etc. That means, first, cd will change the current directory to your home directory. Then, ls /etc will display the contents of /etc.

You could achieve what you want by defining a function, like so:

function go() {
    cd "$1" && ls

Or just type it in the command line on a single line:

function go() { cd "$1" && ls; }

Then go /etc will do what you want.

$1 refers to the first parameter passed to the command in this example /etc. You can refer to subsequent parameters with $2, $3 and so on.

| improve this answer | |
  • 3
    +1. One improvement: only execute ls if cd is successful: go() { cd "$1" && ls; } -- this avoids listing the current directory if the parameter does not exist. – glenn jackman Aug 11 '14 at 19:10
  • This seems to have done the trick. While it doesn't look complicated relatively speaking, it turns out it was still a bit more complicated than I had initially intended. One quick question, though: how does the "$1" work? – Ram Aug 11 '14 at 19:15
  • 2
    @user3471004 - $1 first argument passed to command - this also follows on with $2 for the second, $3 for the third, etc. $@ can also be used to represents all of the arguments. Various examples can be found - e.g this. – Wilf Aug 11 '14 at 20:12

You may want to combine this with the built-in bash directory stack (dirs). this will give you the opportunity to type: go ..., to view the previous folder(s) in your stack, rather then type their name. an eg:

function go() { 
 if [ "$1" == "..." ]; then popd >/dev/null ; else pushd "$1" >/dev/null ; fi
 ls $@

you can substitute ... with other keyword, like _back. something that wont be a directory name.

you will notice the ls $@ which means all remaining parameters will be passed to ls. so if you want to go and have long listing, or reverse time listing, use: go /var -l or go /etc -ltr

| improve this answer | |
  • As you do not remove $1 from $@ it will still be the first argument for ls $@. In most cases this will lead to an error when using relative paths. – Adaephon Aug 12 '14 at 8:48
  • Not particularly relevant to the question. – moopet Aug 12 '14 at 11:20
  • The $@ should be quoted in case any of the original terms contain spaces. Hence it should be ls "$@" (or with best practice ls "${@}"). – Paddy Landau Aug 19 '14 at 10:47

Not the answer you're looking for? Browse other questions tagged or ask your own question.