Sunday, May 5, 2024
 Popular · Latest · Hot · Upcoming
46
rated 0 times [  46] [ 0]  / answers: 1 / hits: 49476  / 2 Years ago, mon, may 30, 2022, 11:36:05

I'm trying to integrate RVM with gnome-terminal.



Per default, gnome-terminal does not start bash as a login shell. I enabled run command as a login shell as suggested in this answer about the same topic setting up RVM, but when I do this the .bashrc file is not read.



For example, I create an environment variable in .bashrc and then when I start a new gnome-terminal I cannot read it. I need to run explicitly source .bashrc to read the file.



Is this the expected behavior?


More From » bash

 Answers
3

Yes, that is the expected behaviour.



The behaviour, in short, is as follows:




  • bash started as an interactive login shell: reads ~/.profile

  • bash started as an interactive non-login shell: reads ~/.bashrc



Read the bash manual about startup files for more details.



Personally, I think that this behaviour is strange and I have not yet found a rationalization for this design decision.






Some explanation of the terminology:




  • An interactive shell is a shell with which you can interact, that means you can type commands in it. Most shells you will use are interactive shells.

  • A non-interactive shell is a shell with which you cannot interact. Shell scripts run inside non-interactive shells.

  • A login shell is the shell which is started when you login to your system.

  • A non-login shell is a shell which is started after the login process.



Most shells you see are interactive non-login shells. This is especially true if you are running a graphical environment like gnome, because then gnome is the "login shell". Any bash session started inside gnome is a non-login shell. If you want to see a real interactive login shell then go to a virtual console (using Ctrl+Alt+F1) and then log in using your username and password. That is a real interactive login bash shell. You can go back to the graphical shell using Ctrl+Alt+F7.



There is an option --login which will make bash behave as if it is a login shell even if started after your have logged in. Configuring gnome-terminal to start bash as a login shell means it will start bash using the --login option.






Usually you want bash to always read ~/.bashrc in an interactive shell. Here is how I recommend to do that:



Create a ~/.bash_profile file. If bash is started as a login shell it will first look for ~/.bash_profile before looking for ~/.profile. If bash finds ~/.bash_profile then it will not read ~/.profile.



Put the following lines in ~/.bash_profile:



[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"


Now if bash is started as an interactive login shell it will read the following files:




  1. ~/.bash_profile

  2. ~/.profile

  3. ~/.bashrc



and if bash is started as an interactive non-login shell:




  1. ~/.bashrc



You should put stuff which is bash specific in ~/.bashrc and stuff which is not bash specific in ~/.profile. For example PATH goes in ~/.profile and HISTCONTROL goes in ~/.bashrc.



Note that ~/.profile is not bash specific. Other text based shells (for example sh or ksh) and graphical shells (gnome) also read ~/.profile. That is why you should not put bash specific stuff in ~/.profile.


[#38713] Tuesday, May 31, 2022, 2 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
naldis

Total Points: 257
Total Questions: 101
Total Answers: 111

Location: Kenya
Member since Sat, Feb 25, 2023
1 Year ago
naldis questions
;