Configuring Bash

Reid Linnemann lreid at cs.okstate.edu
Thu May 15 14:46:31 UTC 2008


Written by Montag on 05/14/08 19:20>>
> This should be a fairly simple process, I don't really know what I am
> missing.
> 
> I've got the following in the .bash_profile of a basic user account:
> 
> # set prompt [user at host--/dir] $ (# for root)
> PS1 = ' [\u@\h--\w] ' 
> case `id -u` in
>       0) PS1='${PS1} # ';; # root
>       *) PS1='${PS1} $ ';; # everyone else
> 
> When I log in, I am greeted with:
> ${PS1} $ $
> 
> However, if I su to root, I get:
> [root at host-- /home/user]# 
> 
> That is what I wanted, but for some reason it is not working for a
> normal user.  I thought perhaps the problem could be that .bash_profile
> is only loaded when a non-login shell is spawned, but a quick
> consultation of man bash revealed that bash reads ~/.bash_profile when
> it is invoked as a login shell.  
> 
> My next thought was that it was a permissions issue, but:
> su
> chmod 777 .bash_profile
> exit
> logout
> login
> 
> That did not change the results, the output was still the same as above.
>  This is all being done at the console, by the way.
> 
> Appreciate any advice,
> 
> montag
> --------------------------
> "Give the people contests they win by remembering the words to more popular songs or the names of state capitals or how much corn Iowa grew last year. Cram them full of non-combustible data, chock them so damned full of 'facts' they feel stuffed, but absolutely 'brilliant' with information. Then they'll feel they're thinking, they'll get a sense of motion without moving."

There are a few problems with what you are attempting here.

Your ~/.bash_profile is executed once, only when you log in. When you su
to root, a shell is started for root (according to root's shell set in
/etc/passwd) and that shell will do whatever it wants to do as far as
dotfile processing is concerned. Your ordinary user's .bash_profile is
ignored.

Since the ordinary user's .bash_profile is only executed once, when the
user's shell starts, the *) condition is always met in the case
statement, so that expression is executed:

PS1='${PS1} $ ';;

This will always result in PS1 being the literal '${PS1} $ ' for that
user. Why? Because if you read your bash manual you'll see that variable
expansion does not happen in single quoted strings.

PS1="${PS1} \$ ";;

The above string will do what you intend, it will set PS1 to whatever
${PS1} is expanded to, plus the extra ' $ ' (you have to escape a
literal $ in a double quoted string).

As has been mentioned before, what you really want is to use the '\$'
literal to clue in the sh/bash to use a # for root and $ for all other
users.

PS1="${PS1} \\$ ";;

That is the PS1 that will do it.

But again, because su invokes a new shell, if root's shell is not a sh
variant that uses $PS1, like the default csh, your prompt will not carry
over. csh will uses its own internal prompt variable and ignore sh's PS1
environment variable.


More information about the freebsd-questions mailing list