There's 3 parts to making it work:
Does the shell start in login or non-login mode?
- Mac's Terminal.app by default starts bash as a login shell.
- Ubuntu graphically logs in as a GUI shell (i.e. your desktop environment, gnome-session, etc.), so it's just not bash at all. But if you then open a terminal in the desktop environment, your manually opened bash shell on Ubuntu may well start as a non-login (i.e. interactive) shell.
- Debian LXDE graphically logs in with bash and runs as a login shell by default.
- Windows Git Bash (MINGW64) seems to start as a login shell by default as well.
Which script runs on shell startup: .profile, .bash_profile, .bashrc?
- Gnome-session or whatever is your desktop environment (DE) is not bash, but the script that starts your DE is supposed to source ~/.profile but NOT ~/.bash_profile. However, it's possible with Debian LXDE that it'll prefer ~/.bash_profile if it exists over the fallback that is ~/.profile.
- Bash as a login mode shell sources ~/.bash_profile and if that's missing then ~/.profile as a fallback.
- Bash as a non-login (interactive) shell sources ~/.bashrc and NOT those other two.
Where should scripts go to run on shell startup?
- So scripts that run only when your desktop environment or graphical shell starts goes into ~/.profile.
- Scripts that run only when you start bash in login mode --- e.g. started with
bash -l
, via the text console mode in Debian or Ubuntu e.g. via Ctrl + Alt + F2, when Mac's Terminal.app opens, or when Git's MINGW Bash opens on Windows --- goes into ~/.bash_profile. - Scripts that run only when you start bash interactively (non-login mode) --- e.g. started by clicking the terminal icon having graphically logged in to Ubuntu's DE --- goes into ~/.bashrc. This assumes you didn't configure your terminal emulator to run as a login shell!
Want the script to always run however shell starts up?
Suppose you want a bit of code to run when your shell starts. It doesn't matter if it's a login, non-login (i.e. interactively started), graphical login from your desktop environment, on Macs, on Windows MINGW, etc.
In principle, I think ~/.bash_profile and ~/.profile both should source in ~/.bashrc as well, so scripts in ~/.bashrc should run whichever way you get your hands into a terminal UI in Ubuntu. But Macs and Windows Git Bash doesn't have a proper .bash_profile to start.
Thus for Macs and Windows, favor ~/.bash_profile.
For Ubuntu Linux, favor ~/.bashrc.
A single method that works on all 3 platforms would be to put the code in ~/.bashrc, then make sure ~/.bash_profile sources in bashrc.
Bibliography
Why ~/.bash_profile is not getting sourced when opening a terminal?DotFiles
No comments:
Post a Comment