Sign up ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free.

I was playing around with aliases today and I noticed that aliases don't seem to be available whilst using sudo:

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

Is there any reason why you cannot use aliases whilst using sudo?

share|improve this question
Did you declare those alias in .bashrc on /root/ – Luciano Facchinelli Jan 17 '11 at 22:52
@LucianoFacchinelli: /root/.bashrc does not get read when running a command through sudo. – Flimm May 16 '13 at 11:25

3 Answers 3

up vote 90 down vote accepted

Add the following line to your ~/.bashrc:

alias sudo='sudo '

From the bash manual:

Aliases allow a string to be substituted for a word when it is used as the first word of a simple command. The shell maintains a list of aliases that may be set and unset with the alias and unalias builtin commands.

The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias. The characters ‘/’, ‘$’, ‘`’, ‘=’ and any of the shell metacharacters or quoting characters listed above may not appear in an alias name. The replacement text may contain any valid shell input, including shell metacharacters. The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded is not expanded a second time. This means that one may alias ls to "ls -F", for instance, and Bash does not try to recursively expand the replacement text. If the last character of the alias value is a space or tab character, then the next command word following the alias is also checked for alias expansion.

(Emphasis mine).
Bash only checks the first word of a command for an alias, any words after that are not checked. That means in a command like sudo ll, only the first word (sudo) is checked by bash for an alias, ll is ignored. We can tell bash to check the next word after the alias (i.e sudo) by adding a space to the end of the alias value.

share|improve this answer
Pretty nice solution. – ulidtko Jan 17 '11 at 23:23
So basically the issue boils down to the fact that sudo is simply programmed in such a way that it does not check alias's therefore ll is not found? – kemra102 Jan 18 '11 at 20:55
@DannyRoberts See my updated answer. – Alvin Row Jan 22 '11 at 4:55
The emphasized quote doesn't show up too well with's current styling. For the curious, here is the key line: "If the last character of the alias value is a space or tab character, then the next command word following the alias is also checked for alias expansion." – Cupcake Feb 7 at 11:15

The aliases are user specific - you need to define them in /root/.bashrc

share|improve this answer
They are already under /root/.bashrc so that's not an issue – kemra102 Jan 18 '11 at 20:55

@Alvins answer is the shortest one. No doubt! :-)

However I thought of a command line solution to execute an aliased command in sudo where there is no need to redefine sudo with an alias command.

Here is my proposal for those to whom it may interest:


type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\`).*(?=')" | xargs sudo


In the case of the ll command

type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo


when you have an alias (such as: ll) the command type -a returns the aliased expression:

$type -a ll
ll is aliased to `ls -l'

with grep you select the text between the accent ` and apostrophe ' in that case ls -l

And xargs executes the selected text ls -l as parameter of sudo.

Yes, a bit longer but completely clean ;-) No need to redefine sudo as alias.

share|improve this answer
Might be simpler if you used the alias builtin, since its output is cleaner. alias ll outputs alias ll='ls -ahlF'. – muru Feb 15 at 19:41

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.