Configuring Bash

Reid Linnemann lreid at cs.okstate.edu
Thu May 15 16:41:27 UTC 2008


Written by Gerard on 05/15/08 10:03>>
> On Thu, 15 May 2008 09:46:27 -0500
> Reid Linnemann <lreid at cs.okstate.edu> wrote:
> 
>> 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.
> 
> I placed the following in my ~/.bash_profile file.
> 
> # This is the .bash_profile file
> # Read on bash login and similar to .profile
> # This file passes control to the '.bashrc' file if it is present
> 
> if [ -f ~/.bashrc ]; then
> . ~/.bashrc
> fi
> 
> Then in my ~/.bashrc file, I created an alias:
> 
> alias su='su -m'
> 
> Now, whenever I go to root, the environment is not modified and I still
> have bash as my shell. I don't know if this will work for you or not.
> It should not hurt to try it.
> 
> 
> 

Nice, I missed that flag for su. I'll take advantage of that for certain.


More information about the freebsd-questions mailing list