0

I'm trying to source my ~/.bashrc file and I get the following error

bash: /home/user/.bashrc: line 57: syntax error near unexpected token `unset'
bash: /home/user/.bashrc: line 57: `fi unset color_prompt force_color_prompt'

how can I fix it? is it a typo?

here's my entire .bashrc file

  GNU nano 6.2                         /home/arnle/.bashrc                                   
# ~/.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)
HISTSIZE=1000 HISTFILESIZE=2000

# 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|*-256color) 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='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\>
    '
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

# colored GCC warnings and errors export 
#GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# 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

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/arnle/miniconda3/bin/conda' 'shell.bash' 'hook' 2> 
/dev/null)" if [ $? -eq 0 ]; then
    eval "$__conda_setup" else
    if [ -f "/home/arnle/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/home/arnle/miniconda3/etc/profile.d/conda.sh" else
        export PATH="/home/arnle/miniconda3/bin:$PATH"
    fi fi unset __conda_setup
# <<< conda initialize <<<

if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)"
fi export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv 
init --path)" export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" 
eval "$(pyenv init --path)" eval "$(pyenv virtualenv-init -)"

# >>> juliaup initialize >>>

# !! Contents within this block are managed by juliaup !!

case ":$PATH:" in *:/home/arnle/.juliaup/bin:*)
        ;;

    *) export PATH=/home/arnle/.juliaup/bin${PATH:+:${PATH}}
        ;;
esac

# <<< juliaup initialize <<<

export PATH="$PATH:/home/arnle/julia-1.9.0-beta4/bin"


1 Answer 1

4
if [ "$color_prompt" = yes ]; then 
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\>
    '
else PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi unset color_prompt force_color_prompt

Stacking more than one fi without a semicolon/newline in between is allowed (as are things like fi esac } done), but you can't put a regular command after fi without the semicolon or a newline in between.

The way the main branch of the conditional is on a separate line from the if, but the else branch is stacked with the else looks a bit odd, and almost like the newline disappear e.g. when copypasting the code from some tool that didn't keep the formatting properly intact.

I would format that with a more symmetrical indentation, and incidentally, in Bash you can insert the newline with e.g. $'\n' without needing to use a hard newline in the quoted string. So:

if [ "$color_prompt" = yes ]; then 
    PS1='...\[\033[01;34m\]\>'$'\n'
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

You have others like that too, fi fi unset __conda_setup and fi export ... at least.

Here,

__conda_setup="$(...)" if [ $? -eq 0 ]; then

The then keyword is in error, since the if isn't recognized as a keyword in the middle of the line. (Instead it would be the name of a regular command here, probably giving a confusing "command not found" error.) You can't put assignments or redirections before a compound command, like you can do with simple commands, so that one needs a newline too. That means the assigned value will be effective for the rest of the script, not just for the command (like with var=foobar some command). But then there's that unset later there, so the newlines appear to be missing in error.

Except that, your code actually reads like this, with a newline after the 2>:

__conda_setup="$('.../conda' 'shell.bash' 'hook' 2> 
/dev/null)" if [ $? -eq 0 ]; then

That's a syntax error of its own, the filename after the redirection has to come on the same line. (Which is unlike e.g. | or &&, which you can just drop at the end of a line, and the next command works as part of the pipeline or list as if the newline wasn't there.)

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.