Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确获取动态bash提示符PS1_Bash_Ps1 - Fatal编程技术网

正确获取动态bash提示符PS1

正确获取动态bash提示符PS1,bash,ps1,Bash,Ps1,我正在处理一个动态bash提示符,希望在PS1中报告本地文件系统上启用了哪个版本的配置文件。这是我试图做的一个做作的例子,简化了。出现问题的地方:包装不良和/或出现逃逸括号。谁能看出我做错了什么 如果人工配置与“v2”匹配,我希望PS1中的版本为黄色。如果是“v1”,则在提示中显示为绿色。设置: $ grep FOOVER foo-*.conf foo-v1.conf:# FOOVER xyz-v1 foo-v2.conf:# FOOVER zet-v2 然后我会将foo.conf foo-v

我正在处理一个动态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进行符号链接。我的朋友:

 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} $ "
当我运行上面的程序时,我得到了这样的行为,一开始看起来很好:

但当我向上箭头指向一个长命令时,就会出现错误的包装:

当我禁用第11行、第14行并启用第12行、第15行时,我得到了用于处理PS1中显示的非打印字符的括号:

(没有足够的声誉点数发布超过2个链接:(imgur.com slash-nkXFDyJ)

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

使用\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"
    }
关于为什么会这样做,这里有一个更完整的答案:

您需要在双引号内使用
\[
\\]
bash
处理所有转义字符,即使
$
是您唯一需要的字符,所以``本身也需要转义。您还应该引用第17行:
echo“$style\u foover”
    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"
    }