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 [EMAIL PROTECTED]/dir] $ (# for root)
> PS1 = ' [EMAIL PROTECTED] ' 
> 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:
> [EMAIL PROTECTED] /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.
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to