提示上的重击完成被当前PS1破坏了

时间:2018-08-08 17:25:57

标签: bash prompt

我认为我在const AssociatedModelMunitionDescription = app.get('sequelizeClient').models.munitionDescription; 中转义序列的方式有问题。实际上,我知道这就是问题所在。我的问题是我不能正确逃避什么?

PS1

诀窍是根据declare __host='\[\e[30;102m\] \h \[\e[0m\]'; declare __dir='\[\e[1;97;44m\] \w \[\e[22m\]'; declare __arrow='\[\e[1m\]▸ \[\e[0m\]'; function __git_status() { local info; info=$(__git_info); [[ $? -eq 0 ]] && printf "\e[30;43m%s" "$info"; } export PS1="$__host$__dir"'$(__git_status)'"$__arrow "; __dir之前的箭头为箭头着色。像这样:enter image description here

3 个答案:

答案 0 :(得分:1)

printf中的转义代码缺少\[ ... \]包装器。

从切切上讲,我还将排除与$?function关键字的无用显式比较。

__git_status() {
  local info
  info=$(__git_info) &&
    printf '\\[\e[30;43m\\]%s' "$info"
}

还请注意在格式字符串和双反斜杠周围切换为单引号(有关详细信息,请参见注释;感谢Charles Duffy的指导)。

Shell脚本在语句之间需要 分号或换行符,您不需要两者。

答案 1 :(得分:0)

感谢您的要旨。看来您问题的答案是printf不想知道\[ \]在非打印字符上的转义符。

__git_status() {
  local info
  info=$(__git_info) &&
    printf '\e[30;43m%s' "$info"
}

对于您设置的PS1来说,对我来说非常完美,并且在确定提示时长方面不会出现问题。我唯一的问题是CentOS不知道如何在终端=(

中打印

答案 2 :(得分:0)

解决方案是更改:

info=$(__git_info) && printf '\e[30;43m%s' "$info"

info=$(__git_info) && printf '\1\e[30;43m\2%s' "$info"

这是因为在执行__git_status函数之前,bash在内部用ASCII 1和2替换了提示特殊字符[和]。