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

And*_*Ray 46 bash function colors echo

我在.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 \$ "
Run Code Online (Sandbox Code Playgroud)

这似乎使shell输出完全正确:

username\[\]@~/

在我的提示中显示了颜色代码周围的转义[和].如果我从它周围的颜色中删除转义码,但是bash换行会突然失败.

请注意,如果PS1="LIGHTGREEN - whatever - $RESET"它可以工作,[和]不会被转义.但是,我想在一个函数中执行此操作,这似乎是个问题.

我找不到任何关于此的好文档.man echo甚至没有列出-e选项.Bash似乎有很多无证的手工知识.

the*_*edk 52

我发现这个主题寻找答案如何通过\[ \]从bash函数中转义来设置bash颜色.

实际上有解决方案.Bash允许在PS1每次呈现提示时生成提示.

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

PROMPT_COMMAND=set_bash_prompt
Run Code Online (Sandbox Code Playgroud)

这样,PS1将在每次显示提示时被解释,因此它将调用函数并正确呈现所有转义序列,包括\[ \] 对于计算提示长度很重要(例如,使命令历史正常工作).

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

  • @ l0b0如果在`call_your_function`中使用颜色,则需要使用`PROMPT_COMMAND`.否则,提示的长度不正确,命令历史记录包装错误. (5认同)
  • 这很棒,谢谢!不幸的是,它打破了Terminal.app打开根据活动选项卡路径的新选项卡的能力.这种能力可以像这样恢复:`PROMPT_COMMAND ="set_bash_prompt; $ PROMPT_COMMAND"`有关详细信息,请参阅http://superuser.com/a/623305/75328. (2认同)

Mau*_*ayo 26

使用\001替代\[\002取代\],并知道使用的后果,PROMPT_COMMAND因为该方法将重置提示每一次(也可以是你想要的东西,).

这里解释了bash提示回显函数内部颜色的解决方案:

\[ \]当你将PS1,如果你把它们打印运行时显示的提示这是行不通的一个函数里只有特殊.在这种情况下,您需要使用字节\001\002

还有另一个指向同一方向的答案:

庆典专用的\[\]其实都是翻译成\001\002

在接受的aswer中建议PS1的函数内部设置PROMPT_COMMAND重置PS1每次都不允许其他脚本轻松修改你的promtp(例如Python virtualnenv activate.sh):

$ echo $PS1
<your PS1>
$ PS1="(TEST)$PS1"
$ echo $PS1
<(TEST) is not prepended to PS1 if you are using PROMPT_COMMAND as it is reset>
Run Code Online (Sandbox Code Playgroud)

  • 圣牛 - 我不敢相信这个问题是6岁,幸运的是,你发布了三天前唯一的工作解决方案!非常感谢.这需要更多的赞成:) (4认同)
  • 这个解决方案与使用 `printf` 而不是 `echo` 结合使用对我有用。 (2认同)

Ign*_*ams 7

\[并且\]必须直接使用$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\] \$ "
Run Code Online (Sandbox Code Playgroud)

  • 如果一个函数比一个颜色回声更多呢?如果它输出`echo -e"$ LIGHTGREEN一些东西$ RESET"`怎么办?这个解决方案 - 将函数调用包装在`\ [和`\]`中 - 似乎也有同样的问题 (3认同)