I frequently run the ls
command after running the cd
command. How can I create an alias (like cs
) for this operation?
6 Answers
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$
-
1That'll fail for directories containing whitespace. See the comment to dv3500ea's answer.– geirhaFeb 2, 2011 at 8:15
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
}
-
2This 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.– dinoOct 1, 2012 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– trusktrOct 30, 2012 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"?– trusktrOct 30, 2012 at 20:52
-
use the full path for it, example :
function ls() { /usr/bin/ls $* }
– OneOfOneOct 31, 2012 at 17:40 -
I had problems redefining
cd
becauservm
changes mycd
definition too. See stackoverflow.com/a/19941991/1601989 May 21, 2014 at 10:22
Use a function instead of an alias:
cs() { cd "$1" && ls; }
-
5
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.
-
8Having
$1
unquoted like that will make it fail if the directory contains whitespace. Also, you should check the return value ofcd
; if it failed (e.g. permission denied), there's no point in running thels
.lc() { cd "$@" && ls; }
– geirhaFeb 2, 2011 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; }
.
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