Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

This question already has an answer here:

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?

share|improve this question

marked as duplicate by guntbert, Eliah Kagan, Eric Carvalho, Gilles, Andrea Corbellini Sep 10 '14 at 9:39

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

2 Answers 2

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.

share|improve this answer
+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? –  user3471004 Aug 11 '14 at 19:15
@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

share|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.