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 斜线 nkXFDyJ)

user@host \[\]xyz-v1 ~ $

..在这种情况下,我仍然会得到糟糕的包装。

4

1 回答 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

于 2014-03-28T07:46:43.887 回答