MacOS – sourcing bash profile for root users

bashmacosterminal

Apologies in advance if this question is going to annoy the hell out of everyone as I appreciate, it's been asked in various ways many times before. Please be assured, I have read the archives and have tried at least some of the suggestions but still cannot resolve the (simple) issue. Hopefully someone can provide an answer and I can feel appropriately humbled. FYI, for the avoidance of any ambiguity, I'm going to use absolute rather than relative paths.

When I log in, I do so as user adam. The aliases in /Users/adam/.bash_profile are loaded and I can use them immediately upon pulling up a terminal. I don't use a .bashrc file and that's fine.

Every now and then, I switch to root by typing su into the terminal and then entering my password. The prompt changes and I am now root user. My question is this: immediately upon becoming root, can my root bash profile be loaded without me having to manually source the profile file? The reason I know it doesn't happen automatically is because I have the same aliases in my root profile file and my /Users/adam/.bash_profile. After becoming root user, unless I type in source [root_profile_file], they don't work. I have tried setting up the following permutations and then switching to root via the terminal but none of them automatically source the profile/aliases (note, I don't have any of the options below set up concurrently so I don't think I'm confusing the system):

Option 1: put my aliases in /etc/profile

Option 2:

  • in /etc/profile, insert [ -r /etc/bashrc ] && . /etc/bashrc
  • put my aliases in /etc/bashrc

Option 3:

  • in /etc/bash_profile, insert [ -r /etc/bashrc ] && . /etc/bashrc
  • put my aliases in /etc/bashrc

Option 4: put my aliases in /var/root/.profile

Option 5:

  • in /var/root/.profile, insert [ -r /var/root/.bashrc ] && . /var/root/.bashrc
  • put my aliases in /var/root/.bashrc

Option 6:

  • in /var/root/.bash_profile, insert [ -r /var/root/.bashrc ] && . /var/root/.bashrc
  • put my aliases in /var/root/.bashrc

Please note, with any of the above, if I switch to root and then type source root_profile_file the aliases are loaded but only if I do indeed source the file manually. Perhaps I've totally misunderstood how bash works and it's not possible to source a profile file automatically after switching to root but I'm hoping there is a simple solution. Thanks in advance to anyone who's taken the time to read this message.

Best Answer

The problem you are encountering is that when you run su by itself, you are not entering a 'login' shell. This means that your environment, working directory, and everything except uid/gid remain the same of the original user.

Login triggers do not execute, and you experience the issues you describe.

A simple solution to a simple problem:

su -

From the su(1) man page:

The su command is used to become another user during a login session. Invoked without a username, su defaults to becoming the superuser. The optional argument - may be used to provide an environment similar to what the user would expect had the user logged in directly.

Also:

   -, -l, --login
       Provide an environment similar to what the user would expect had the user logged in directly.

If you su into a login shell, bash will behave as you expect, and automatically source the appropriate files on "login", without the need for overly hacky workarounds.