I have set my own bash prompt PS1 in ~/bashrc, which works fine with login shells.
It also works when becoming root in a terminal with 'su'.
However, after issuing '. /etc/profile' for example as part of system maintenance, my custom PS1 returns to the default set by /etc/profile.
This is because ~/.bashrc is not sourced in this case.
My attempted solution to this was to set PS1 in /etc/profile.d/custom.sh instead of ~/bashrc. But this does not work because /etc/profile sets PS1 after sourcing
Would it be possible to source /etc/profile.d/* after setting PS1 in /etc/profile please?
This would allow system wide PS1 customization through /etc/profile.d/*.
bashrc stuff really belongs after /etc/profile.d stuff. Setting PS1 belongs in bashrc.
I suggest you edit /etc/bash/bashrc, or source ~/.bashrc whenever you source /etc/profile.
I agree with PS1 stuff probably belonging into some *bashrc* file, but that does not solve my problem. And there is PS1 stuff in /etc/profile already and according to above reasoning, it schould not be there.
Actually, removing all PS1 stuff from /etc/profile solves my problem too.
But I have no idea why it ended up there in the first place, so I guess it is there for a reason and it is best to keep it there for now.
Editing /etc/bash/bashrc also does not solve my problem, none of the bashrc stuff
is read during . /etc/profile.
Of course, I could change /etc/profile and source ~./bashrc there or I could just apply the suggested bug fix myself.
But that defeats the whole purpose of /etc/*.d/ directories, which is to allow modification of system defaults, either by package management or the system administrator, without touching system files and having to deal with them after system upgrades.
/etc/bash/bashrc does it right, /etc/bash/bashrc.d/* is sourced right at the end, /etc/profile should do it the same way.
/etc/profile.d/* allows modification of everything except for PS1, which I consider a bug.
Edit: Setting my PS1 in /etc/bash/bashrc.d/* actually solves my problem because the PS1 stuff in /etc/profile sources /etc/bash/bashrc conditionally.
Thanks for pointing me in the right direction.
But I think the rest of my argument is still valid, /etc/profile.d/* should be sourced at the end of /etc/profile.
In the past, I have researched this in detail.
A bash login shell (bash -l) sources
A bash (non-login) shell (bash) sources
In case of a login shell, it's up to /etc/profile and/or ~/.bash_profile to also source the non-login shell parts *afterwards*, so
In your case, when you only source /etc/profile, you simulate only half of the login shell process. This is your problem (if I understand correctly). To simulate a full login shell, you should additionally source ~/.bash_profile, so:
As an alternative, you can simply start a new login shell (which does a source of both), so:
exec bash -l