Gwe*_*ery 5 bash shell refactoring return-value command-prompt
我是 Bash 编程的新手,我正在努力创建自定义 Bash 命令提示符。我的目标是创建一个提示,当它们与我通常使用的不同时,它只显示登录名和主机名。我还希望在 Git 版本控制下的目录中将当前 Git 分支附加到命令提示符。
我想将登录名和主机名部分涂成绿色,将目录路径涂成蓝色,将 Git 分支部分涂成粉色,将分隔符(: 和 $ 字符)涂成白色。但是,当先前执行的命令返回零以外的任何内容时,我想将 $ 分隔符着色为红色。没有颜色的一般格式如下所示:
loginname@hostname:~/current/path:branchname$
Run Code Online (Sandbox Code Playgroud)
唯一必须的部分是目录路径和 $ 字符。这是我为.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}\` "
Run Code Online (Sandbox Code Playgroud)
这段代码满足我的所有要求,只是它始终将 $ 字符保留为白色,并且在适当的时候不会将其着色为红色。(我怀疑问题是DOLLAR中的“\$?”引用了之前执行的命令,但是DOLLAR是在构造PS1时最后执行的,所以之前的execute语句不再是PS1构造开始之前运行的命令;它的东西这是为了创建命令提示符而执行的。)我不知道如何解决这个问题。
这段代码很丑,需要重构。我试图将所有颜色代码移动到它们自己的变量中,但是当我在 GITBRN 的代码中使用这些颜色变量时,事情变得混乱,所以我最终在那里使用了文字颜色。
我花了一整天的时间试图让这段代码正常工作,但我认为此时我无处可去。任何有关如何在适当的时间将美元符号变为红色的建议将不胜感激。我也愿意接受重构代码以使其更清晰和更具可读性的建议。
PS 我是 Ubuntu Linux (Lucid Lynx) 用户。
使用PROMPT_COMMAND根据 bash 手册页在每个主要提示之前执行的变量。
例如(这还行不通,我正在努力让它正常工作,但我认为这是可能的):
PROMPT_COMMAND="if [ \$? = 0 ]; then DOLLAR="${WHITE}\$${NORMAL}"; else DOLLAR="${RED}\$${NORMAL}"; fi"
Run Code Online (Sandbox Code Playgroud)
编辑:由于与执行命令和内部非打印字符挫折PS1(中\[和\]有时会打印出字面上,而不是作为提示,PS1),我想出了这个(替换...为任何你想要在你的提示):
PROMPT_COMMAND='if [ $? = 0 ]; then DOLLAR_COLOR="\033[0m"; else DOLLAR_COLOR="\033[31m"; fi'
PS1='...\[$(echo -ne $DOLLAR_COLOR)\]$\[\033[m\] '
Run Code Online (Sandbox Code Playgroud)

当然, using$()你可以把它的任何你喜欢的部分放在里面PS1而不是 using PROMPT_COMMAND,我只是喜欢这种方式,以便PROMPT_COMMAND包含逻辑并PS1包含显示命令。