bash - 在上一个命令失败后创建带有红色 $ 的 Bash 命令提示符

标签 bash shell refactoring return-value command-prompt

我是 Bash 编程的新手,我正在致力于创建一个自定义 Bash 命令提示符。我的目标是创建一个提示,它只显示与我通常使用的不同的登录名和主机名。我还希望在 Git 版本控制下的目录中将当前 Git 分支附加到命令提示符。

我想将登录名和主机名部分涂成绿色,将目录路径涂成蓝色,将 Git 分支部分涂成粉红色,将分隔符(: 和 $ 字符)涂成白色。但是,当先前执行的命令返回零以外的任何值时,我想将 $ 分隔符涂成红色。没有颜色的一般格式如下所示:

loginname@hostname:~/current/path:branchname$

唯一必须的部分是目录路径和 $ 字符。这是我为我的 .bashrc 文件编写的代码:

MYNAME="gwen"
MYHOST="gwen-laptop"

RED="\[\033[31m\]"
WHITE="\[\033[0m\]"
GREEN="\[\033[01;32m\]"
BLUE="\[\033[01;34m\]"
PINK="\[\033[01;35m\]"

DOLLAR="if [ \$? = 0 ]; then echo ${WHITE}\$; else echo ${RED}\$${NORMAL}; fi"
GITBRN='$(__git_ps1 "\033[0m:\033[01;35m%s")'

USERNM="if [ \u != ${MYNAME} ]; then whoami; fi;"
HOSTNM="if [ \h != ${MYHOST} ]; then echo -n @; hostname; fi;"
COLONM="if [ \u != ${MYNAME} ] || [ \h != ${MYHOST} ]; then echo -n :; fi;"

PS1="${GREEN}\`${USERNM}\`\`${HOSTNM}\`${WHITE}\`${COLONM}\`${BLUE}\w${GITBRN}\`${DOLLAR}\` "

此代码满足我的所有要求,只是它始终将 $ 字符保留为白色,并且在适当的时候没有将其着色为红色。 (我怀疑问题是DOLLAR中的"\$?"引用了之前执行的命令,但是构建PS1时DOLLAR是最后执行的,所以之前的execute语句不再是PS1构建开始之前运行的命令;这是一些东西这是为了创建命令提示符而执行的。)我不确定如何解决这个问题

这段代码很丑陋,需要重构。我试图将所有颜色代码移动到它们自己的变量中,但是当我在 GITBRN 的代码中使用这些颜色变量时,事情变得一团糟,所以我最终在那里使用了文字颜色。

我已经花了一整天的时间试图让这段代码正常工作,但我认为我目前无处可去。任何关于如何在适当的时候把美元符号变成红色的建议都将不胜感激。我也乐于接受有关重构代码以使其更清晰、更具可读性的建议。

附言我是 Ubuntu Linux (Lucid Lynx) 用户。

最佳答案

使用 PROMPT_COMMAND 变量,根据 bash 手册页,它在每个主要提示符之前执行。

例如(这还行不通,我正在努力使其正常工作,但我认为这是可能的):

PROMPT_COMMAND="if [ \$? = 0 ]; then DOLLAR="${WHITE}\$${NORMAL}"; else DOLLAR="${RED}\$${NORMAL}"; fi"

编辑:由于在 PS1(\[\] 有时会按字面意思打印出来,而不是用作 PS1 的提示),我想出了这个(将 ... 替换为您在提示中想要的任何内容):

PROMPT_COMMAND='if [ $? = 0 ]; then DOLLAR_COLOR="\033[0m"; else DOLLAR_COLOR="\033[31m"; fi'
PS1='...\[$(echo -ne $DOLLAR_COLOR)\]$\[\033[m\] '

当然,使用 $() 你可以把它的任何部分放在 PS1 而不是使用 PROMPT_COMMAND,我只是喜欢这样,PROMPT_COMMAND 包含逻辑,PS1 包含显示命令。

关于bash - 在上一个命令失败后创建带有红色 $ 的 Bash 命令提示符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7135824/

相关文章:

go - 在 Golang monorepo 中查找死代码

linux - 使用 gdbus 实用程序将对象作为参数传递

php - 允许 PHP 以 root 权限执行 bash 脚本

shell - 如何在unix中每行末尾添加文本

linux - 什么是充分利用 csh 或 tcsh 的好资源?

swift - 我如何在 Xcode 中重构 Swift?

linux - Linux下用bash脚本将一个C程序的输出重定向到另一个C程序

linux - bash脚本: using "script" command to write console output to a file in real time

linux - 脚本不会在使用 init 启动时启动

c# - 如何重构此 C# 代码?