我的 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]wn[$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\[\]\[\]$\[\] "
有什么想法吗?如何调试此行为?
问题是第 ret_str="[$green]$"
行中的$
没有转义。
用逃离
$
解决了问题。
修复:
ret_str="[$green]$"