difference between bash.bashrc and /etc/environment file
One difference is that /etc/environment
contains only variable definitions and doesn't appear to go through any sort of variable expansion/interpolation. Thus, you can't reference variables in definitions. This for instance won't work:
A="else"
B="something $A"
B will literally be something $A
, not the expected something else
.
See this question.
By the way, the answer you found through Google appears to be referring to a user's ~/.bashrc
, rather than the system-wide /etc/bash.bashrc
. That may be causing your confusion.
The /etc/environment
file sets the variable system wide for every user on boot. Commands in the /etc/bash.bashrc
are is executed if the bash
shell is opened by any user. So the variables would not be set unless a bash
shell is opened at least one time.
And as you are asking about "system wide":
Configuration files located in the /etc
directory apply to all users on the system. For /etc/bash.bashrc
this would mean to all and everything that's using the "Borne Again SHell" aka Bash on that machine. Even if you're the only human using it, there could be "technical users" affected (simply take a look into the /etc/passwd
and check how often the term "/bin/bash" is stated there -- or use grep bash /etc/passwd | wc -l
, which should give you that number directly (meaning: "grab" all lines containing the string "bash" from the file "/etc/passwd", and send the results ("|") to the command "wc" (word count) to count the lines ("-l").
So for your user, it is much safer to modify ~/.bashrc
instead (meaning the file ".bashrc" -- with a leading dot, yes -- in your home-directory, e.g. /home/ankur/.bashrc
), which then just affects your user and leaves everything else alone. Files in /etc
should only be changed if system-wide changes are really intended.
Besides: Both configurations will be used if they exist. First, the system-wide file (here: /etc/bash.bashrc
) is read and "sourced" (it's settings applied to the current session), and then the users /home/username/.bashrc
is handled the same, and thus can add to or even change/overwrite settings from the global /etc/bash.bashrc
file.
Beyond the system wide and user wide scope discussion, one most significant difference is /etc/environment
is not a script other than ~/.bashrc
.
You cannot dereference variable inside /etc/environment
, its variable assignment which takes line value literally (as already mentioned by roadmr).
Your Ubuntu will lock you out if you screw up the $PATH
inside /etc/environment
by trying to append new path
PATH=$PATH:/new_path
If your Ubuntu Gnome or Unity login page failed in letting you in without complaining wrong password. And you have recently modified /etc/environment
, it's most likely the case.
A fix is to login virtual console CTRL+ALT+F1 login console, manually check $PATH
, and fix /etc/environment
file.
According to this, /etc/environment
is loaded by PAM stack, which populates environment variable line by line.