Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.bashrc break, second line entered in shell eats up first line

Tags:

bash

I've using a .bashrc from one of peepcode's screencast.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# 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, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default.
# If this is an xterm set the title to user@host:dir
#case "$TERM" in
#xterm*|rxvt*)
#    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
#    ;;
#*)
#    ;;
#esac

# enable bash completion in interactive shells
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
#    . /etc/bash_completion
#fi

# sudo hint
if [ ! -e "$HOME/.sudo_as_admin_successful" ]; then
    case " $(groups) " in *\ admin\ *)
    if [ -x /usr/bin/sudo ]; then
    cat <<-EOF
    To run a command as administrator (user "root"), use "sudo <command>".
    See "man sudo_root" for details.

    EOF
    fi
    esac
fi

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found ]; then
    function command_not_found_handle {
            # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
           /usr/bin/python /usr/lib/command-not-found -- $1
                   return $?
                elif [ -x /usr/share/command-not-found ]; then
           /usr/bin/python /usr/share/command-not-found -- $1
                   return $?
        else
           return 127
        fi
    }
fi

. ~/bin/bash_colors.sh

#load bash aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

# Unbreak broken, non-colored terminal
export TERM='xterm-color'
alias ls='ls -G'
alias ll='ls -lG'
export LSCOLORS="ExGxBxDxCxEgEdxbxgxcxd"
export GREP_OPTIONS="--color"

# Erase duplicates in history
export HISTCONTROL=erasedups
# Store 10k history entries
export HISTSIZE=10000
# Append to the history file when exiting instead of overwriting it
shopt -s histappend

function minutes_since_last_commit {
    now=`date +%s`
    last_commit=`git log --pretty=format:'%at' -1`
    seconds_since_last_commit=$((now-last_commit))
    minutes_since_last_commit=$((seconds_since_last_commit/60))
    echo $minutes_since_last_commit
}
grb_git_prompt() {
    local g="$(__gitdir)"
    if [ -n "$g" ]; then
        local MINUTES_SINCE_LAST_COMMIT=`minutes_since_last_commit`
        if [ "$MINUTES_SINCE_LAST_COMMIT" -gt 30 ]; then
            local COLOR=${RED}
        elif [ "$MINUTES_SINCE_LAST_COMMIT" -gt 10 ]; then
            local COLOR=${YELLOW}
        else
            local COLOR=${GREEN}
        fi
        local SINCE_LAST_COMMIT="${COLOR}$(minutes_since_last_commit)m${NORMAL}"
        # The __git_ps1 function inserts the current git branch where %s is
        local GIT_PROMPT=`__git_ps1 "(%s|${SINCE_LAST_COMMIT})"`
        echo ${GIT_PROMPT}
    fi
}

export PS1='$(grb_git_prompt)$ '

gd() { git diff $* | view -; }
gdc() { gd --cached $*; }

source ~/bin/git-completion.bash

I can confirm the error is in grb_git_promit. What happens is the second lines typed in shell is overwriting the first line. Can anyone could help me with this?

EDIT:

grb_git_prompt() {
    local g="$(__gitdir)"
    if [ -n "$g" ]; then
        local MINUTES_SINCE_LAST_COMMIT=`minutes_since_last_commit`
        if [ "$MINUTES_SINCE_LAST_COMMIT" -gt 30 ]; then
            local COLOR="\[\033[0;31m\]"
        elif [ "$MINUTES_SINCE_LAST_COMMIT" -gt 10 ]; then
            local COLOR="\[\033[0;37m\]"
        else
            local COLOR="\[\033[0;32m\]"
        fi
        local SINCE_LAST_COMMIT="${COLOR}$(minutes_since_last_commit)m$"
        # The __git_ps1 function inserts the current git branch where %s is
    echo "$(__git_ps1 '(%s|')${SINCE_LAST_COMMIT}"
    fi
}
like image 500
sent-hil Avatar asked Feb 23 '11 04:02

sent-hil


People also ask

How do you continue to the next line in bash?

From the bash manual: The backslash character '\' may be used to remove any special meaning for the next character read and for line continuation.

How do you go to the next line in shell?

So, you literally need a newline (press ENTER ) after you type the \ to tell the shell you want to enter more parameters but on a separate line.


1 Answers

When you have colors and other non-printing escape sequences in your prompt, you have to surround them with escaped single brackets. Here is a simple example:

PS1='\[\033[38;5;1m\]some red text\[\033[0m\]\$ '

Which will cause the prompt to display "some red text" in red and the dollar sign (or "#") in the default color.

Here is another way to do the same thing:

red='\033[38;5;1m'
none='\033[0m'
PS1='\[$red\]some red text\[$none\]\$ '

By the way, to do this more portably and have less complex build-up of variables:

red=$(tput setaf 1)
none=$(tput sgr0)

See man 5 terminfo for more information on the settings.

like image 200
Dennis Williamson Avatar answered Nov 05 '22 21:11

Dennis Williamson