Updates done to .bashrc do not hold across Terminal sessions

Hello everyone,
I have a habit of adding custom commands like mkcdir (to make dir & do a cd into the newly created directory or combination of ls with it parameters to make shorthands, like ll).

mkcdir example: (taken from unix stackexchange)

mkcdir ()
    mkdir -p -- "$1" &&
       cd -P -- "$1"

Up until now, I would enter the above function in .bashrc and do a source .bashrc. That would make the change become available in the current bash terminal instance as well as the new ones.

However, in manjaro-gnome-21.2.2 when I add the above mentioned function and do source .bashrc, the change does not stick across terminals.

# ~/.bashrc

[[ $- != *i* ]] && return

colors() {
	local fgc bgc vals seq0

	printf "Color escapes are %s\n" '\e[${value};...;${value}m'
	printf "Values 30..37 are \e[33mforeground colors\e[m\n"
	printf "Values 40..47 are \e[43mbackground colors\e[m\n"
	printf "Value  1 gives a  \e[1mbold-faced look\e[m\n\n"

	# foreground colors
	for fgc in {30..37}; do
		# background colors
		for bgc in {40..47}; do
			fgc=${fgc#37} # white
			bgc=${bgc#40} # black


			printf "  %-9s" "${seq0:-(default)}"
			printf " ${seq0}TEXT\e[m"
			printf " \e[${vals:+${vals+$vals;}}1mBOLD\e[m"
		echo; echo

[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion

# Change the window title of X terminals
case ${TERM} in
		PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\007"'
		PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\033\\"'


# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS.  Try to use the external file
# first to take advantage of user additions.  Use internal bash
# globbing instead of external grep binary.
safe_term=${TERM//[^[:alnum:]]/?}   # sanitize TERM
[[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs}    ]] \
	&& type -P dircolors >/dev/null \
	&& match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true

if ${use_color} ; then
	# Enable colors for ls, etc.  Prefer ~/.dir_colors #64489
	if type -P dircolors >/dev/null ; then
		if [[ -f ~/.dir_colors ]] ; then
			eval $(dircolors -b ~/.dir_colors)
		elif [[ -f /etc/DIR_COLORS ]] ; then
			eval $(dircolors -b /etc/DIR_COLORS)

	if [[ ${EUID} == 0 ]] ; then
		PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] '
		PS1='\[\033[01;32m\][\u@\h\[\033[01;37m\] \W\[\033[01;32m\]]\$\[\033[00m\] '

	alias ls='ls --color=auto'
	alias grep='grep --colour=auto'
	alias egrep='egrep --colour=auto'
	alias fgrep='fgrep --colour=auto'
	if [[ ${EUID} == 0 ]] ; then
		# show root@ when we don't have colors
		PS1='\u@\h \W \$ '
		PS1='\u@\h \w \$ '

unset use_color safe_term match_lhs sh

#alias cp="cp -i"                          # confirm before overwriting something
#alias df='df -h'                          # human-readable sizes
#alias free='free -m'                      # show sizes in MB
#alias np='nano -w PKGBUILD'
#alias more=less

xhost +local:root > /dev/null 2>&1

# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control.  #65623
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize

shopt -s expand_aliases

# export QT_SELECT=4

# Enable history appending instead of overwriting.  #139609
shopt -s histappend

# # ex - archive extractor
# # usage: ex <file>
ex ()
  if [ -f $1 ] ; then
    case $1 in
      *.tar.bz2)   tar xjf $1   ;;
      *.tar.gz)    tar xzf $1   ;;
      *.bz2)       bunzip2 $1   ;;
      *.rar)       unrar x $1     ;;
      *.gz)        gunzip $1    ;;
      *.tar)       tar xf $1    ;;
      *.tbz2)      tar xjf $1   ;;
      *.tgz)       tar xzf $1   ;;
      *.zip)       unzip $1     ;;
      *.Z)         uncompress $1;;
      *.7z)        7z x $1      ;;
      *)           echo "'$1' cannot be extracted via ex()" ;;
    echo "'$1' is not a valid file"

# custom aliases
alias ll='ls -alF'

# custom functions
mkcdir ()
    mkdir -p -- "$1" &&
       cd -P -- "$1"

Output of running source .bashrc

zsh: command not found: shopt
zsh: command not found: complete
zsh: command not found: complete
zsh: command not found: complete
zsh: command not found: complete
zsh: command not found: complete
zsh: command not found: complete
zsh: command not found: complete
zsh: command not found: complete
zsh: command not found: complete
zsh: command not found: complete
/usr/share/bash-completion/bash_completion:1567: parse error near `|'
.bashrc:type:64: bad option: -P
zsh: command not found: shopt
zsh: command not found: shopt
zsh: command not found: shopt

mkcdir & ll works in this instance.

However, in new terminal instances,

$ mkcdir                                                                                                                                                                                         
zsh: correct 'mkcdir' to 'mkdir' [nyae]? n
zsh: command not found: mkcdir

How do I fix this? Please advice. Thank You.

About System:
gnome version: 41.3
Windowing system: X11

Source .bashrc in the bash shell not in zsh.


apparently, your current shell is zsh
and you are making adjustments to the configuration file for bash
which is the wrong one and will not work


Understood guys. Taking your advice, I did some searching on how to make my changes stick in zsh. And here is what I found:

  • create ~/.zshrc if it does not exist
  • add the commands in that file
  • execute it: . ~/.zshrc
  • done

With the above set of steps my custom functions & aliases are now running perfectly across zsh instances.

Two points…

  1. If you declare a function in bash and you want this function to be available in subshells, then you have to export the function. An example follows below… :arrow_down:
some_function ()
export -f some_function
  1. Both the GNOME and Plasma editions of Manjaro use zsh as the interactive shell in terminal windows nowadays — tty sessions still use bash. zsh is a very different shell, with a very different way of declaring and loading functions, and different initialization files.


I was opening a subject about .bashrc not being invoked when the system suggested this posting was related so I saw your response about terminal sessions using zsh… which is why I’m asking my question in this thread verses a new one. Though a new one would probably make sense, depending on how well known this is. That said…

What I noticed was that .bashrc doesn’t seem to play any role UNLESS I ssh into the system. I checked /etc/passwd and it does call for bash, I checked the $SHELL value and it shows to be set to /bin/bash… Considering your statement on zsh… I thought I would inquire if I understood correctly and if so ask about where I might find additional information before I before I… before I… I guess I don’t know… I guess to dig in and find why /etc/passwd is being ignored, and what’s up with $SHELL… Well, the thought is a bit confusing so I’m probably getting ahead of myself…

SO… would you advise me on if I understood correctly and if so… where I might look to… hmm, understand more, I suppose.

Thank You

System Details
Description: Manjaro Linux
Release: 21.2.3
plasmashell 5.23.5
Qt: 5.15.2
KDE Frameworks: 5.90.0
kf5-config: 1.0

This is KDE specific. The KDE terminal emulator can be configured to use a specific shell. Find this setting and switch to bash if you want. There are multiple thread about this on the forum.

For example

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.