How are environment variables defined in a Gnome terminal session?
Hello... and thanks in advance for any help anyone can offer me with my question! I'm hoping someone will have a little patience with me and walk me through this!
I'm trying to understand a user login process on Centos 7 and I've gotten a bit confused trying to figure out when/how a Gnome terminal session defines environment variables (Gnome 3.14.4).
As near as I can tell.... a Gnome terminal will only define environment variables from the /etc/profile, ~/.profile, or ~/.bash_profile if the variables were exported in those scripts.
If they aren't exported then they don't appear in the output of either the set or printenv commands. The /etc/environment file is the exception (but it's not a shell login script).
The only thing I've found that looks like it would do this is the /etc/X11/xinit/xinitrc-common file when it sources the ~/.profile login script... But that's just a single login script and doesn't explain why exported variables in /etc/profile & ~!/.bash_profile are being displayed in set.
[-r $HOME/.profile ] && . $HOME/.profile
If this reads the variables in the ~/.profile script... How are the variables being read for /etc/profile & ~/.bash_profile? If it matters.... I haven't selected "run command as login script"
Once again... thanks to anyone willing to read this and set me straight!
Gnome terminal is not a shell and doesn't really set environment variables for you. Somewhere in your setup for Gnome terminal you told it that you wanted it to start a shell for you. It starts that shell as a login shell which causes it to read its own initialization scripts.
If one of the scripts your login shell is reading is ~/.bash_profile, the shell that has been configured for you is bash.
If you were using a BSD, Linux, or UNIX system the login shell for a user would be found in the user database (frequently contained in a file named /etc/passwd). I believe that Windows has a similar user database, but I don't remember where it is located nor how it is accessed.
First... thanks for the reply! I hope I can ask for your patience as I try to understand this
I've done quite a bit of reading to try and understand this.... The documentation I had read said that the Bash login scripts (/etc/profile, ~/.bash_profile, ~/.profile, etc) wouldn't get sourced/executed in an interactive non-login shell mode (i.e. Gnome terminal)... and this specific shell mode would only read the /etc/bashrc and the ~/.bashrc scripts.
This had me slightly confused on how a Gnome terminal might go about getting environment variables that would be required to make programs work correctly in an interactive login shell mode (i.e. SSH, Telnet, etc). So I started playing with it.
Like I said, I discovered, if I defined variables simply as local variables (without the 'export' command) in the login scripts they would not be displayed in the output of set/printenv commands.... Which is how the documentation said it would behave
But by playing with things, I discovered if I exported the variable in the Bash login scripts, they were appearing in the output of the set/printenv commands. Initially I thought they were being exported as a global variable from an SSH (putty) sessions
So I did a reboot, and logged in directly to Gnome (Multiple times), to make sure I wasn't accidentally exporting a global variable by a SSH session.
To try and figure this out... I started poking around Gnome and found the /etc/X11/xinit/xinitrc-common file sources the $HOME/.profile script. But this hardly explains the exported variables from the other login scripts... So I'm left pretty baffled on why documentation is saying one thing... But what I'm see Centos & Gnome do is something totally different
Anyway... once again thank you for your reply... If you could help me understand this I would be extremely grateful!!!
I would expect that running similar commands in your Gnome terminal window will produce similar results, but the first field in the output from who am i will be your login ID instead of mine and the 2nd field will be your terminal device ID instead of ttys006. If you then issue that ps command with your terminal device ID as the -t option option-argument, I would expect to see similar output on your screen with the -ksh in my output replaced by a -bash in your output. The login command shown in my output is what macOS uses to start a login session. There might or might not be a similar line in your ps output depending on how Centos starts a login session.