Ask Ubuntu is a question and answer site for Ubuntu users and developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

share|improve this question

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

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
share|improve this answer
That'll fail for directories containing whitespace. See the comment to dv3500ea's answer. – geirha Feb 2 '11 at 8:15
@geirha Thanks for the info, fixed my answer. – Alvin Row Feb 2 '11 at 18:22

You can use the builtin command in bash :

function cd() {
    if [ $# -eq 0 ]; then 
    builtin cd "${new_directory}" && ls
share|improve this answer
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 1 '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 – DavidG May 21 '14 at 10:22

Use a function instead of an alias:

cs() { cd "$1" && ls; }
share|improve this answer
+1, as this version will stop if 'cd' fails. – htorque Dec 4 '10 at 12:44
up vote 7 down vote accepted

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;

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

share|improve this answer
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 2 '11 at 8:13

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; }.

share|improve this answer

I had problems redefining cd because rvm changes my cd definition too. See 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
  elif [[ -d "$*" ]]; then
    cd "$*"
  elif [[ -f "$*" ]]; then
    echo "WARNING: file given, cd to file's dirname" 1>&2
    local dir=$(dirname "$*")
    cd "$dir"
    cd "$*"

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
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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