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匿名):