Super User is a question and answer site for computer enthusiasts and power users. 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

There are a few question on the site that seem related to my problem but I could not find a solution in any of them.

My operating system is Ubuntu 12.04. I have mvn installed in /tools/noarch/apache-maven-3.1.1 and I have added the following lines at the end of my /etc/profile:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

After that I execute source /etc/profile.

Now my problem is: when I run mvn --version the command succeeds and mvn executable is found, while if I execute: sudo mvn --version I get the output: sudo: mvn: command not found. I know that PATH may be different when I execute a command with sudo and that is why I tried this:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

Another thing I tried is to execute sudo su - and then type mvn --version. In this case mvn is successfully found and the command succeeds. What is going on here?

share|improve this question
Related: Why are PATH variables different when running via sudo and su? at Unix SE – kenorb Dec 24 '15 at 18:04
up vote 26 down vote accepted

$PATH is evaluated by your shell, so your check doesn't work as you expect it to.

/etc/sudoers is configured to replace your PATH with a default one.

sudo does not load a login shell environment before executing the command, so the default PATH from /etc/sudoers is used. su - does open a login shell, which involves loading /etc/profile. See man bash, section INVOCATION.

Just remove the PATH reset in /etc/sudoers. It's likely a rule called secure_path.


In CentOS you can add PATH to the Defaults env_keep section:

                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        _XKB_CHARSET XAUTHORITY PATH"
share|improve this answer
Thank you for the answer. It does solve the problem, but I prefer the solution suggestion in the other two answers as it performs a change only for maven, not for all commands in my PATH. – izomorphius Jan 31 '14 at 9:28
FYI: Please note my answer update. – kriegaex Nov 6 '15 at 7:54

Give sudo your current PATH with:

sudo env "PATH=$PATH" your_command
share|improve this answer
A great answer, which does not require modifying any settings, letting the caller do everything which is necessary. I would use the -E option in addition, to preserve the rest of the environment. In fact, this is so handy it can be put in a script/alias/function for easy use. I'll add this as a separate answer - but kudos to @opyate! – Tom Mar 31 '15 at 23:05
When I try to run this command I get env: cmd: No such file or directory - Any ideas why that would be? – Andy Apr 30 '15 at 8:47
@Andy replace cmd with your actual command. – opyate Apr 30 '15 at 9:23
Haha thanks..I feel like a complete noob – Andy Apr 30 '15 at 11:24

Elaborating on @opyate's answer, I am using the following shell script (which may be named mysudo, for example):

sudo -E env "PATH=$PATH" "$@"
  • -E tells sudo to preserve the environment.
  • env "PATH=$PATH" is expanded outside the sudo call, making the external PATH available inside the sudo too (this is required in addition to the -E as the PATH usually receives special treatment in addition to the treatment the entire environment receives).
  • "$@" passes the arguments our script receives to the sudo line.

Save the script in a file in a directory in the PATH, give it +x permissions, et voilà.

share|improve this answer
This is a much better solution for those that don't want to edit any existing files. – qaisjp Jan 29 at 13:27

I had the same problem when I first installed maven, the problem got solved after I added those 2 lines:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

to 4 files


and for the current user (mehran is my ubuntu username):

share|improve this answer

You must modify root's PATH variable exactly like you did for yourself, i.e. by adding those two lines in sudo's profile, which is located in /root/.bashrc, then source it.

share|improve this answer
I have edited /root/.bashrc but am not able to source it: sudo source /root/.bashrc gets: sudo: source: command not found and without the sudo I get permission denied(as expected). i believe starting a new terminal should in theory do the same as source, but after starting a new terminal, sudo mvn --version still does not find anything. – izomorphius Jan 31 '14 at 9:20
@izomorphius You cannot sudo source. You must first switch to sudo with the command sudo su, then you can source the file in question. There is no other way to do it. – MariusMatutiae Jan 31 '14 at 9:23

Since the current answers are a little vague, the specific setting in /etc/sudoers changing your path is secure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

You can modify it it with sudo visudo, or better yet, add the directories you need:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .