Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

g0gie

macrumors regular
Original poster
Jan 31, 2005
201
0
Hey guys,

Im wondering if you could help me with a problem. I am trying to set up my shell in OSX (BASH shell) and the problem I'm having is that the terminal doesnt execute the ".bashrc" file. the ".bash_profile" gets executed but not the rc file, and both are located in the ~/ directory. Any ideas?
 

g0gie

macrumors regular
Original poster
Jan 31, 2005
201
0
it's unorthodox to move wat "belongs" in the rc file to the profile file, ex. aliases, env variables executed by rc, other stuff by profile (thats why there's 2)
 

dfinn

macrumors member
Jun 15, 2005
52
0
g0gie said:
Hey guys,

Im wondering if you could help me with a problem. I am trying to set up my shell in OSX (BASH shell) and the problem I'm having is that the terminal doesnt execute the ".bashrc" file. the ".bash_profile" gets executed but not the rc file, and both are located in the ~/ directory. Any ideas?


I believe it has something to do with the way the login is being initiated. Because it's just starting a new shell, and not a whole new login process bash is only reading .bash_profile. This is normal, it's not an OSX thing, it's a bash thing. What you can do is have .bash_profile source .bashrc by putting something like this in your .bash_profile:

. .bashrc

I believe that should work, you might have to give the full path like this though:

. /home/user/.bashrc

and then every time .bash_profile is read (which is any time bash is called) it will also grab whatever it is that you have setup in .bashrc. You can read more about this by reading the bash man pages (man bash).
 

yellow

Moderator emeritus
Oct 21, 2003
16,018
6
Portland, OR
Frankly, I hate bash.

All I can tell you is that .profile and .bash_profile are what is sourced when your bash shell starts. Whether that's an "unorthodox" approach or not, I don't know, don't care (bash sux :)).

You could always add it to /etc/bashrc, which is even more unorthodox.

Or, change the .bash_profile to source the .bashrc

To fix that, you need to explicitly set SHELL in your .bashrc file. What you want is a .bash_profile like this:

. ~/.bashrc
ENV=$HOME/.bashrc
export ENV
 

g0gie

macrumors regular
Original poster
Jan 31, 2005
201
0
I believe that traditionaly the rc file is executed BEFORE the .profile, so that the env variables ect, can be in place so the .profile can executed correctly (in case it needs those env variables ect to be executed before the script is run)
 

dfinn

macrumors member
Jun 15, 2005
52
0
Here's the info from man bash on my debian system:

A login shell is one whose first character of argument zero is a -, or one started with the --login option.

An interactive shell is one started without non-option arguments and without the -c option whose standard
input and error are both connected to terminals (as determined by isatty(3)), or one started with the -i
option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to
test this state.

The following paragraphs describe how bash executes its startup files. If any of the files exist but cannot
be read, bash reports an error. Tildes are expanded in file names as described below under Tilde Expansion in
the EXPANSION section.

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it
first reads and executes commands from the file /etc/profile, if that file exists. After reading that file,
it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands
from the first one that exists and is readable. The --noprofile option may be used when the shell is started
to inhibit this behavior.

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.

When an interactive shell that is not a login shell is started, bash reads and executes commands from
/etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the --norc option. The
--rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and
~/.bashrc.

When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV
in the environment, expands its value if it appears there, and uses the expanded value as the name of a file
to read and execute. Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file name.
If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as
closely as possible, while conforming to the POSIX standard as well. When invoked as an interactive login
shell, or a non-interactive shell with the --login option, it first attempts to read and execute commands from
/etc/profile and ~/.profile, in that order. The --noprofile option may be used to inhibit this behavior.
When invoked as an interactive shell with the name sh, bash looks for the variable ENV, expands its value if
it is defined, and uses the expanded value as the name of a file to read and execute. Since a shell invoked
as sh does not attempt to read and execute commands from any other startup files, the --rcfile option has no
effect. A non-interactive shell invoked with the name sh does not attempt to read any other startup files.
When invoked as sh, bash enters posix mode after the startup files are read.

When bash is started in posix mode, as with the --posix command line option, it follows the POSIX standard for
startup files. In this mode, interactive shells expand the ENV variable and commands are read and executed
from the file whose name is the expanded value. No other startup files are read.

Bash attempts to determine when it is being run by the remote shell daemon, usually rshd. If bash determines
it is being run by rshd, it reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files
exist and are readable. It will not do this if invoked as sh. The --norc option may be used to inhibit this
behavior, and the --rcfile option may be used to force another file to be read, but rshd does not generally
invoke the shell with those options or allow them to be specified.

If the shell is started with the effective user (group) id not equal to the real user (group) id, and the -p
option is not supplied, no startup files are read, shell functions are not inherited from the environment, the
SHELLOPTS variable, if it appears in the environment, is ignored, and the effective user id is set to the real
user id. If the -p option is supplied at invocation, the startup behavior is the same, but the effective user
id is not reset.



So, I think I had it backwards. I'm guessing you are using terminal. When you are starting up terminal it must be initiating bash as an interactive login shell.
 

Westside guy

macrumors 603
Oct 15, 2003
6,340
4,158
The soggy side of the Pacific NW
dfinn is correct. One of the typical ways to do this is to put these lines in .bash_profile:

Code:
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

This just means "if the file .bashrc exists in your home directory, source it".

P.S. Personally I've learned to love bash after having used tcsh for several years.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.