Little UNIX help please :D

Discussion in 'macOS' started by g0gie, Jul 6, 2005.

  1. g0gie macrumors regular

    Joined:
    Jan 31, 2005
    #1
    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?
     
  2. yellow Moderator emeritus

    yellow

    Joined:
    Oct 21, 2003
    Location:
    Portland, OR
    #2
    yes. Move the contents of .bashrc to .bash_profile

    I believe you can also use .profile
     
  3. g0gie thread starter macrumors regular

    Joined:
    Jan 31, 2005
    #3
    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)
     
  4. dfinn macrumors member

    Joined:
    Jun 15, 2005
    #4

    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).
     
  5. yellow Moderator emeritus

    yellow

    Joined:
    Oct 21, 2003
    Location:
    Portland, OR
    #5
    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
     
  6. g0gie thread starter macrumors regular

    Joined:
    Jan 31, 2005
    #6
    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)
     
  7. dfinn macrumors member

    Joined:
    Jun 15, 2005
    #7
    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.
     
  8. Westside guy macrumors 601

    Westside guy

    Joined:
    Oct 15, 2003
    Location:
    The soggy side of the Pacific NW
    #8
    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.
     

Share This Page