Changing behavior of bash prompt when functioning as root

39,949

Solution 1

It will also depend on how you become the root user. You need to make the change in the root user's .bashrc if you are using something like su - root or sudo -i, where you read in the environment.

With sudo -s, you should be reading your own .bashrc.

Consider adding some printf or echo statements to debug your code, to tell you when it has executed.

Use the id command to make sure you are who you think you are:

root@tau:~# id
uid=0(root) gid=0(root) groups=0(root)

Solution 2

To change the colour of the prompt to red for root, I modified the .bashrc file, following the examples in this thread.

regularuser@myubuntubox:~$ sudo su - 
root@myubuntubox:~# vim .bashrc

Then, in vim, search for the final appearance of PS1 assignment, and add this following it (note that it updates the value of $PS1 so that other previous lines do not need to be modified, and the change is easily revertible):

# Set RED prompt
PS1="\[\e[01;31m\]$PS1\[\e[00m\]"

Solution 3

Following belacqua's valid answer https://askubuntu.com/a/305053/12218, by issuing sudo su the root's .bashrc is loaded.

You can check this by issuing sudo su followed by cd ~ you will see that you are at root's home directory.

Using sudo su you log in as root (su = switch user) in contrary with
sudo do some administrative task as user with elevated privileges.

So by using sudo su you become the actual root and the changes made to environment are changes made specifically to root, i.e: sudo su followed by vim .bashrc.

Share:
39,949
zmitchell
Author by

zmitchell

Updated on September 18, 2022

Comments

  • zmitchell
    zmitchell over 1 year

    Before you click away, this isn't the typical "how do I make my bash prompt have color" question. I've already customized my bash prompt to look like this:

    [user @ host]----[$(pwd)]
    $ 
    

    where everything in brackets is light blue, and everything else (including $) is black by adding the following to my ~/.bashrc file

    # Turn the prompt symbol red if the user is root
    if [ $(id -u) -eq 0 ];
    then # you are root, make the prompt red
        PS1="[\e[01;34m\u @ \h\e[00m]----[\e[01;34m$(pwd)\e[00m]\n\e[01;31m#\e[00m "
    else
        PS1="[\e[01;34m\u @ \h\e[00m]----[\e[01;34m$(pwd)\e[00m]\n$ "
    fi
    

    The goal is to make it such that the only thing that changes when I use 'sudo su' is that the black $ changes into a red #. I've looked in /etc/bash.bashrc and /etc/profile to see if there is just a line to comment out, but there is a bunch of stuff about debian_chroot that I don't understand, and I don't want to screw something up. How can I accomplish what I want?

    P.S. This is what I want the prompt to look like as root

    [user @ host]----[$(pwd)]
    (red)#
    

    edit: Mark this solved, appending the above code to ~/.bashrc while root accomplished my goal. Also, in the above code, $(pwd) only displays the home directory (I guess because that is the working directory when the terminal is opened), and never updates. Replacing $(pwd) with \w fixes this, but displays the home directory as ~, which I was trying to avoid.

    • Admin
      Admin almost 11 years
      Are you using $pwd or $PWD?
    • Admin
      Admin almost 11 years
      It'll fail to wrap lines correctly since you did not tell bash that you were using non-printable characters. Enclose non-printable characters, such as \e[01;31m, in \[...\]. This is explained under PROMPTING in the manual. Also see mywiki.wooledge.org/BashFAQ/053
    • Admin
      Admin over 8 years
      Reason why pwd did not work in the prompt is, that you need to escape the dollar-sign, otherwise $(pwd) will be executed before the content is placed in $PS1. You can test it with this: PS1="\$(pwd) ".
  • zmitchell
    zmitchell almost 11 years
    I'm using sudo su
  • belacqua
    belacqua almost 11 years
    sudo su reads ~root/.bashrc (at least as currently implemented on my 13.04 system).
  • Captain Man
    Captain Man over 4 years
    A similar thing can be accomplished with \$ which shows # if root and $ otherwise. \$ isn't very useful though since it's not customizable.