获取一个动态的Bash提示符PS1

5
我正在开发一个动态的bash提示符,希望在PS1中报告本地文件系统上启用的配置文件版本。这是我试图做的一个人为的例子,简化了一下。出现问题的地方是:换行不良和/或转义括号出现。有人能看出我做错了什么吗?
如果虚构的配置与“v2”匹配,我想在PS1中以黄色显示该版本。如果是“v1”,则在提示符中以绿色显示。设置如下:
$ grep FOOVER foo-*.conf
foo-v1.conf:# FOOVER xyz-v1
foo-v2.conf:# FOOVER zet-v2

然后我会将foo.conf创建符号链接到foo-v1.conf。我的bashrc文件:

 0 GREEN=$(tput setaf 034)
 1 YELLOW=$(tput setaf 3)
 2 BLUE=$(tput setaf 4)
 3 CYAN=$(tput setaf 6)
 4 BOLD=$(tput bold)
 5 RESET=$(tput sgr0)
 6 CONF=$HOME/foo.conf
 7
 8 function __get_foo_version () {
 9   FOOVER=$(grep FOOVER $CONF | awk '{print $3}')
10   if [[ "$FOOVER" =~ v2$ ]]; then
11     style_foover="${BOLD}${YELLOW}$FOOVER"
12     #style_foover="\[${BOLD}${YELLOW}\]$FOOVER"
13   elif [[ "$FOOVER" =~ v1$ ]]; then
14     style_foover="${BOLD}${GREEN}$FOOVER"
15     #style_foover="\[${BOLD}${GREEN}\]$FOOVER"
16   fi
17   echo $style_foover
18 }
19
20 style_host="\[${RESET}${BLUE}\]"
21 style_path="\[${RESET}${CYAN}\]"
22 style_reset="\[${RESET}\]"
23
24 PS1='user@'
25 PS1+="${style_host}host"
26 PS1+="${style_reset} "
27 PS1+="\$(__get_foo_version) "
28 PS1+="${style_reset}"
29 PS1+="${style_path}\W"
30 PS1+="${style_reset} $ "

当我运行上述代码时,一开始看起来效果不错:http://imgur.com/HIR3SoA 但是当我按上箭头到一个长命令时,就会出现错误的换行:http://imgur.com/qLfdUor 当我禁用第11、14行并启用第12、15行时,括号将处理非打印字符的意图显示在PS1中:
(没有足够的声望点来发布超过2个链接:( imgur.com slash nkXFDyJ)
user@host \[\]xyz-v1 ~ $

..在这种情况下,我仍然会得到不良换行。


你需要在双引号内使用 \\[\\]bash 处理所有转义字符,尽管 $ 是你唯一需要处理的转义字符,但 \\ 本身也需要转义。 - chepner
你还应该引用第17行:echo "$style_foover" - chepner
1个回答

7

使用\x01(或\001)和\x02(或\002),然后通过echo -e进行评估:

    function __get_foo_version () {
      FOOVER=$(grep FOOVER $CONF | awk '{print $3}')
      if [[ "$FOOVER" =~ v2$ ]]; then
        #style_foover="${BOLD}${YELLOW}$FOOVER"
>>>     style_foover="\x01${BOLD}${YELLOW}\x02$FOOVER"
      elif [[ "$FOOVER" =~ v1$ ]]; then
        #style_foover="${BOLD}${GREEN}$FOOVER"
>>>     style_foover="\x01${BOLD}${GREEN}\x02$FOOVER"
      fi
>>>   echo -e "$style_foover"
    }

这里提供一份更加详细的答案,解释了此方法为何有效: https://superuser.com/questions/301353/escape-non-printing-characters-in-a-function-for-a-bash-prompt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接