34

I frequently run the ls command after running the cd command. How can I create an alias (like cs) for this operation?

Eliran Malka
  • 1,205
  • 18
  • 36
dv3500ea
  • 36,816
  • 13
  • 99
  • 152

6 Answers6

37

From Bash Tips and Tricks: 'cd' with style:

Finally, I want to show you how to write your own custom replacement for the 'cd' command.

Do you find yourself always typing the same thing upon changing into a directory? You probably at least list the files there every time, perhaps so much that your hands automatically type 'ls' after every 'cd'.

Well, by trying every way I could think of, it turns out there's only one way to properly accomplish the goal we're seeking. We have to create a shell function.

Shell functions are part of shell programming. Like in compiled programming languages, functions provide a sort of procedural modularizability. One can create a generic function to perform an often-used bit of logic or computation with different parameters. In this case, the parameter is the current working directory.

Here's a simple one:

function cs () {
    cd $1
    ls
}

As @geirha corretly notes, the above function will fail if you try to switch to a directory with a space in its name:

$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>  

You should instead use the following function:

function cs () {
    cd "$@" && ls
    }

Once you add that code to your ~/.bashrc, you should be able to do this:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Isaiah
  • 58,486
  • 28
  • 133
  • 145
  • 1
    That'll fail for directories containing whitespace. See the comment to dv3500ea's answer. – geirha Feb 02 '11 at 08:15
27

You can use the builtin command in bash :

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}
dino
  • 187
  • 1
  • 2
  • 9
OneOfOne
  • 463
  • 4
  • 8
  • 2
    This is pretty slick. I had a solution similar to @Florian in my .bashrc for a very long time, but this is much more satisfactory for when I forget that colleagues don't have my 'cs' alias on their computers. – dino Oct 01 '12 at 12:45
  • I like this answer the best. For some reason, you can't use aliases to overwrite the command, so you have to make a function like this answer. :D – trusktr Oct 30 '12 at 20:45
  • But what about non-builtin commands? For example, the above won't work for overwriting the ls command. Is there some keyword to use instead of "builtin"? – trusktr Oct 30 '12 at 20:52
  • use the full path for it, example : `function ls() { /usr/bin/ls $* }` – OneOfOne Oct 31 '12 at 17:40
  • I had problems redefining `cd` because `rvm` changes my `cd` definition too. See http://stackoverflow.com/a/19941991/1601989 – DavidGamba May 21 '14 at 10:22
17

Use a function instead of an alias:

cs() { cd "$1" && ls; }
Stefano Palazzo
  • 85,787
  • 45
  • 210
  • 227
Florian Diesch
  • 86,013
  • 17
  • 224
  • 214
8

Thanks Florian Diesch for the tip of using a function. I can't use cs as the name because there is a cs command in the csound package, so I used lc.

I added this to ~/.bash_aliases (nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

The terminal needs to be reset for this to come into effect.

dv3500ea
  • 36,816
  • 13
  • 99
  • 152
  • 8
    Having `$1` unquoted like that will make it fail if the directory contains whitespace. Also, you should check the return value of `cd`; if it failed (e.g. permission denied), there's no point in running the `ls`. `lc() { cd "$@" && ls; }` – geirha Feb 02 '11 at 08:13
1

As an expansion to this function: cs() { cd "$1" && ls; }, you may want to pass all of the function's arguments to cd by using $@ instead of "$1" as such: cs() { cd $@ && ls; }.

1

I had problems redefining cd because rvm changes my cd definition too. See https://stackoverflow.com/a/19941991/1601989. I didn't really want to use builtin because that would skip whatever rvm is doing.

I added the following to my .bashrc:

# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
  if [[ $# -eq 0 ]]; then
    cd
  elif [[ -d "$*" ]]; then
    cd "$*"
  elif [[ -f "$*" ]]; then
    echo "WARNING: file given, cd to file's dirname" 1>&2
    local dir=$(dirname "$*")
    cd "$dir"
  else
    cd "$*"
  fi
}

function cs()
{
  cdd $* && ls
}

And then after the rmv line in the .bashrc:

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd
DavidGamba
  • 284
  • 1
  • 9