有时光标会在bash提示符

时间:2016-05-24 22:12:29

标签: bash

我有以下脚本中定义的bash提示符 -

#!/bin/bash

if tput setaf 1 &> /dev/null; then
    tput sgr0; # reset colors
    bold=$(tput bold);
    reset=$(tput sgr0);
    black=$(tput setaf 235)
    red=$(tput setaf 1)
    green=$(tput setaf 142)
    yellow=$(tput setaf 214)
    blue=$(tput setaf 66)
    purple=$(tput setaf 175)
    cyan=$(tput setaf 37)
    gray=$(tput setaf 246)
    white=$(tput setaf 223)
    orange=$(tput setaf 208)
else
    bold='';
    reset="\e[0m";
    black="\e[1;30m";
    blue="\e[1;34m";
    cyan="\e[1;36m";
    green="\e[1;32m";
    orange="\e[1;33m";
    purple="\e[1;35m";
    red="\e[1;31m";
    violet="\e[1;35m";
    white="\e[1;37m";
    yellow="\e[1;33m";
fi;

# Highlight the user name when logged in as root.
if [[ "$USER" == "root" ]]; then
    userStyle="$red";
else
    userStyle="$orange";
fi;

# Highlight the hostname when connected via SSH.
if [[ "$SSH_TTY" ]]; then
    hostStyle="$green";
else
    hostStyle="$gray";
fi;

dirStyle="$cyan"

function prompt_command {
    ret_code=$?
    # Are we running in a shell invoked from Vim?
    if [[ "$VIM" ]]; then
        vim="(Vim) "
    else
        vim=""
    fi

    # Did last command return non-zero value?
    if [ "$ret_code" != 0 ]; then
        ret_str="\[$red\]$ret_code>"
    else
        ret_str="\[$green\]$"
    fi

    PS1="\[$userStyle\]\u \[$reset\]at \[$hostStyle\]\H \[$reset\]in \[$dirStyle\]\w\n\[$yellow\]$vim$ret_str\[$reset\] "
}
export PROMPT_COMMAND=prompt_command
export PS2="\[$blue\]continue -> \[$reset\]"

它非常简单,只是用户名,主机名,当前目录和几个变量 - 一个用于检查是否从vim调用了shell,另一个用于返回最后一个命令的返回代码。

当我尝试完成标签时,有时光标会跳到行首。在发生这种情况时,我无法找到模式。

这是提示的样子 -

rogandhi at sjc-ads-253 in ~/tools
$
rogandhi at sjc-ads-253 in ~/tools
$ adsf
-bash: adsf: command not found
rogandhi at sjc-ads-253 in ~/tools
127>

从vim调用shell时看起来像这样 -

rogandhi at sjc-ads-253 in ~/tools
(Vim) $
rogandhi at sjc-ads-253 in ~/tools
(Vim) $ asdf
bash: asdf: command not found
rogandhi at sjc-ads-253 in ~/tools
(Vim) 127>

以下是declare -p PS1

的输出
rogandhi at sjc-ads-253 in ~/tools
$ declare -p PS1
declare -- PS1="\\[\\]\\u \\[\\]at \\[\\]\\H \\[\\]in \\[\\]\\w\\n\\[\\]\\[\\]\$\\[\\] "

有什么想法吗?我该如何调试此行为?

1 个答案:

答案 0 :(得分:2)

问题在于,$ret_str="\[$green\]$"未转义。

使用$转义\解决了问题。

修正:

ret_str="\[$green\]\$"