.bashrc not run on login

11,395

Do you have .profile or a .bash_profile?

When BASH is invoked as a login shell, the following scripts are executed:

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

I have the following in my ~/.profile to invoke .bashrc:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi
Share:
11,395

Related videos on Youtube

stefgosselin
Author by

stefgosselin

I am a french Canadian PHP developper, interested in anything related to Open-Source Web developpment.

Updated on September 18, 2022

Comments

  • stefgosselin
    stefgosselin almost 2 years

    I have been playing with colorized prompts, set in .bashrc.

    The problem is I always need to source the .bashrc after logging in. When I log in, I can see the file is sourced (I tried adding an echo "SOURCED" at top of the file.

    Yet when I login, the commands for colored prompts never run, although re-sourcing .bashrc works - colors are set after source ~/.bashrc, I am curious as to the nature of this behavior.

    # ~/.bashrc: executed by bash(1) for non-login shells.
    # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
    # for examples
    
    # If not running interactively, don't do anything
    case $- in
        *i*) ;;
          *) return;;
    esac
    
    # don't put duplicate lines or lines starting with space in the history.
    # See bash(1) for more options
    HISTCONTROL=ignoreboth
    
    # append to the history file, don't overwrite it
    shopt -s histappend
    
    # for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
    HISTFILESIZE=1000000
    HISTSIZE=1000000
    
    # Ignore commands that start with a space, and duplicates
    HISTCONTROL=ignoreboth
    
    # Ignore certain commands
    HISTIGNORE='ls:bg:fg:history'
    
    # Timestamp commands
    HISTTIMEFORMAT='%F %T '
    
    # One commands per line
    shopt -s cmdhist
    
    # Save commands to history immediately
    PROMPT_COMMAND='history -a'
    
    
    # check the window size after each command and, if necessary,
    # update the values of LINES and COLUMNS.
    shopt -s checkwinsize
    
    # If set, the pattern "**" used in a pathname expansion context will
    # match all files and zero or more directories and subdirectories.
    #shopt -s globstar
    
    # make less more friendly for non-text input files, see lesspipe(1)
    [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
    
    # set variable identifying the chroot you work in (used in the prompt below)
    if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
        debian_chroot=$(cat /etc/debian_chroot)
    fi
    
    # set a fancy prompt (non-color, unless we know we "want" color)
    case "$TERM" in
        xterm-color) color_prompt=yes;;
    esac
    
    
    
    # uncomment for a colored prompt, if the terminal has the capability; turned
    # off by default to not distract the user: the focus in a terminal window
    # should be on the output of commands, not on the prompt
    force_color_prompt=yes
    
    if [ -n "$force_color_prompt" ]; then
        if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
            # We have color support; assume it's compliant with Ecma-48
            # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
            # a case would tend to support setf rather than setaf.)
            color_prompt=yes
        else
            color_prompt=
        fi
    fi
    
    if [ "$color_prompt" = yes ]; then
        PS1=`echo -ne "$HOST_COLOR\H\[\033[00m\]\[\e[$COLON_COLOR\]:\[\033[01;32m\]\w\[\033[00m\]\\[\033[01;33m\]\$\[\033[00m\] "`
       # PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    else
        PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    fi
    unset color_prompt force_color_prompt
    
    # If this is an xterm set the title to user@host:dir
    case "$TERM" in
    xterm*|rxvt*)
        PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
        ;;
    *)
        ;;
    esac
    
    # enable color support of ls and also add handy aliases
    if [ -x /usr/bin/dircolors ]; then
        test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
        alias ls='ls --color=auto'
        #alias dir='dir --color=auto'
        #alias vdir='vdir --color=auto'
    
        alias grep='grep --color=auto'
        alias fgrep='fgrep --color=auto'
        alias egrep='egrep --color=auto'
    fi
    
    # some more ls aliases
    alias ll='ls -alF'
    alias la='ls -A'
    alias l='ls -CF'
    
    # Add an "alert" alias for long running commands.  Use like so:
    #   sleep 10; alert
    alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
    
    # Alias definitions.
    # You may want to put all your additions into a separate file like
    # ~/.bash_aliases, instead of adding them here directly.
    # See /usr/share/doc/bash-doc/examples in the bash-doc package.
    
    if [ -f ~/.bash_aliases ]; then
        . ~/.bash_aliases
    fi
    
    # enable programmable completion features (you don't need to enable
    # this, if it's already enabled in /etc/bash.bashrc and /etc/profile
    # sources /etc/bash.bashrc).
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi
    
    # Add bin to path
    PATH="${PATH:+${PATH}:}$HOME/bin"
    
    # Color the colon red if root
    COLON_COLOR='0m'
    if [ ${UID} -eq 0 ]; then
        COLON_COLOR='1;31m'
    fi
    
    • Eliah Kagan
      Eliah Kagan about 6 years
      How are you logging in? SSH? You said echo "TEST" at the top of .bashrc prints TEST so it seems .bashrc is being sourced. What happens if you instead put it just below the esac line? This will check for the (admittedly small) possibility that your login shell is somehow noninteractive (which could happen if you're logging in with some unusual method). Please edit with this information and also the contents of all of ~/.profile, ~/.bash_profile, and ~/.bash_login that exist. Thanks!
  • stefgosselin
    stefgosselin about 6 years
    Yes, indeed I do. I think it is sourced at login, because setting echo "TEST" at top of .bashrc get printed out when I log in.
  • Martin W
    Martin W about 6 years
    I don't see that echo "TEST" in the source above. Just out of curiosity, is that before or after the interactive test?