bash提示符和回显函数内的颜色

我有这个在我的.bashrc中:

LIGHTGREEN="\[\033[1;32m\]" LIGHTRED="\[\033[1;31m\]" WHITE="\[\033[0;37m\]" RESET="\[\033[0;00m\]" function error_test { if [[ $? = "0" ]]; then echo -e "$LIGHTGREEN" else echo -e "$LIGHTRED" fi } PS1="\u\$(error_test)@\w$RESET \$ " 

这似乎使shell输出完全一样:

username\[\]@~/

在我的提示中显示了颜色代码的转义[和]。 如果我从它的工作颜色周围删除转义码,但然后bash线包装大大失败。

注意如果PS1="LIGHTGREEN - whatever - $RESET"它工作,并且[和]不逃脱。 不过,我想在一个函数里面这样做,这似乎是个问题。

我找不到任何好的文档。 man echo甚至没有列出-e选项。 Bash好像有很多无证的手工知识。

我发现这个话题寻找答案如何设置bash的颜色与转义bash函数\[ \]

其实有解决办法。 Bash允许在每次提示提示时生成PS1提示。

 set_bash_prompt(){ PS1="\u@\h $(call_your_function) $>" } PROMPT_COMMAND=set_bash_prompt 

这样,PS1每次显示提示时都会被解释,所以它会调用函数并正确渲染所有的转义序列,包括对计数提示长度(例如使命令历史工作正确)很重要的\[ \]

希望这会帮助别人,因为我花了半天的时间来解决这个问题。

\[\]必须直接在$PS*使用,而不是通过echo输出。

 LIGHTGREEN="\033[1;32m" LIGHTRED="\033[1;31m" WHITE="\033[0;37m" RESET="\033[0;00m" function error_test { if [[ $? = "0" ]]; then echo -e "$LIGHTGREEN" else echo -e "$LIGHTRED" fi } PS1="\u\[\$(error_test)\]@\w\[$RESET\] \$ " 

几年后…使用\001而不是\[\002而不是\] ,并且要知道使用PROMPT_COMMAND的后果,因为该方法会每一次都重置提示(这也可以是你想要的)。

这里解释了bash提示符在函数内部回显颜色的解决scheme:

只有当您指定PS1时, \[ \]才是特殊的,如果您在显示提示时运行的function中打印它们,则不起作用。 在这种情况下,您需要使用字节\001\002

还有另外一个答案可以带来同样的方向:

bash特定的\[\]实际上被翻译为\001\002

PROMPT_COMMAND调用的函数中设置PS1 ,正如接受的PROMPT_COMMAND所build议的那样,每次都会重置PS1而不允许其他脚本轻松修改您的promtp(例如Python virtualnenv activate.sh )。 你可以testing这个:

 $ echo $PS1 <your PS1> $ PS1="(TEST)$PS1" $ echo $PS1 <(TEST) is not prepended to PS1 as it was reset> 

我意识到这是一个老话题,但我刚刚得到这个function的工作。 诀窍是将function的打印和非打印部分分开,以便可以用[]正确包围非打印部分。 通常我喜欢我的ERROR ..行分开(这不是一个问题),但是如果一切都在一行,这也正常工作。

请注意,我返回以前的$? 每个子shell的值如此$? 从一个传播到另一个。

 PS1="\n\ \[\` cja_prv_retval=\$?; if [ \$cja_prv_retval != 0 ]; then echo -ne \$E_ERROR; fi exit \$cja_prv_retval \`\]\ \` cja_prv_retval=\$?; if [ \$cja_prv_retval != 0 ]; then echo -ne \"ERROR: RETURN CODE \$cja_prv_retval\"; fi exit \$cja_prv_retval \`\ \[\` cja_prv_retval=\$?; if [ \$cja_prv_retval != 0 ]; then echo -ne \$E_RESET; fi exit \$cja_prv_retval \`\]\ ${P_RESET}${P_GRAY}\! \t ${P_RED}\u${P_GRAY}@${P_GREEN}\h ${P_YELLOW}\w ${P_CYAN} ══>${P_RESET} " 

这也给了我

 2021 12:28:05 cja@morpheus04 ~ ══> 

如果没有错误,或者

 ERROR: RETURN CODE 1 2021 12:28:16 cja@morpheus04 ~ ══> 

如果有错误。 一切都是正确的间隔(多行历史编辑正确)。

这里是我的PS1代码的彩色退出代码部分:

 color_enabled() { local -i colors=$(tput colors 2>/dev/null) [[ $? -eq 0 ]] && [[ $colors -gt 2 ]] } BOLD_FORMAT="${BOLD_FORMAT-$(color_enabled && tput bold)}" ERROR_FORMAT="${ERROR_FORMAT-$(color_enabled && tput setaf 1)}" RESET_FORMAT="${RESET_FORMAT-$(color_enabled && tput sgr0)}" # Exit code PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $BOLD_FORMAT $ERROR_FORMAT $exit_code $RESET_FORMAT " ")' 

截图(一个Subversion版本库path匿名): 彩色编码输出