Update:
Setting global environment variables should still be performed in /etc/environment
, but as you pointed out, using sudo -s
has the effect of these variables are "vanished".
The reason for that is sudo
has a policy of resetting the Environment and setting a secure path. It is enabled by default:
/etc/sudoers:
Defaults env_reset
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Thus whatever is set in the /etc/environment
for the path is overridden by sudo
.
The manual page for sudoers
states:
env_reset If set, sudo will reset the environment to only contain
the LOGNAME, MAIL, SHELL, USER, USERNAME and the SUDO_*
variables. Any variables in the caller's environment
that match the env_keep and env_check lists are then
added. The default contents of the env_keep and
env_check lists are displayed when sudo is run by root
with the -V option. If the secure_path option is set,
its value will be used for the PATH environment
variable. This flag is on by default.
As a workaround, you can use sudo su
that will provide a shell with root privileges but containing the right PATH.
Original Answer
You should set it in /etc/environment
.
Try sudo YOUR_TEXT_EDITOR /etc/environment
(make sure to create a backup first).
For more information: EnvironmentVariables
System-wide environment variables
Environment variable settings that affect the system as a whole
(rather then just a particular user) should not be placed in any of
the many system-level scripts that get executed when the system or the
desktop session are loaded, but into
/etc/environment
- This file is specifically meant for system-wide environment variable settings. It is not a script file, but rather
consists of assignment expressions, one per line. Specifically, this
file stores the system-wide locale and path settings.
Not recommended:
/etc/profile
- This file gets executed whenever a bash login shell is entered (e.g. when logging in from the console or over ssh), as
well as by the DisplayManager when the desktop session loads. This is
probably the file you will get referred to when asking veteran UNIX
system administrators about environment variables. In Ubuntu, however,
this file does little more then invoke the /etc/bash.bashrc file.
/etc/bash.bashrc
- This is the system-wide version of the ~/.bashrc file. Ubuntu is configured by default to execute this file
whenever a user enters a shell or the desktop environment.
Best Answer
Quick fix: since you already have the correct
$PATH
set in your environment (via the/etc/profile
modifications) you can use:Basically, sudo resets the value of
$PATH
(the whole environment, indeed) to a "known good" one, and is thus ignoring any changes you made to your local environment. The env command above sets thePATH
variable in the environment of thetlmgr
it executes, so it runs with the value of$PATH
you specify on the command line.To avoid typing all that for each TeXlive command, you can define an alias in your shell: add the following line to the
.bashrc
file in your home:and then you can simply issue this at a command prompt:
In addition, sudo does not run a login shell to execute the command, which is why your "profile.d" tricks did not work for root. You can force sudo to execute a command in a shell, which is an alternate way of achieving the same effect:
Again you can define a shell command alias to shorten this:
which can be used as: