我正在尝试使用以下脚本设置我的bash提示符。一切正常,但我在Git存储库中打印分支名称的部分以及颜色分支的状态。颜色有些随意,但不用说,如果任何文件未提交,它将是红色,如果文件未分阶段,则为黄色,而对于其他任何文件,则为绿色。它以白色的思想打印出我想要的部分。当我运行脚本的一部分时,在最后,我单独定义$branchStyle
,它可以工作,但它不在这里。我做错了什么?
prompt_git() {
local s=""
local branchName=""
# check if the current directory is in a git repository
if [ $(git rev-parse --is-inside-work-tree &>/dev/null; printf "%s" $?) == 0 ]; then
# check if the current directory is in .git before running git checks
if [ "$(git rev-parse --is-inside-git-dir 2> /dev/null)" == "false" ]; then
# ensure index is up to date
git update-index --really-refresh -q &>/dev/null
# check for uncommitted changes in the index
if ! $(git diff --quiet --ignore-submodules --cached); then
s="$s+";
fi
# check for unstaged changes
if ! $(git diff-files --quiet --ignore-submodules --); then
s="$s!";
fi
# check for untracked files
if [ -n "$(git ls-files --others --exclude-standard)" ]; then
s="$s?";
fi
# check for stashed files
if $(git rev-parse --verify refs/stash &>/dev/null); then
s="$s$";
fi
fi
# get the short symbolic ref
# if HEAD isn't a symbolic ref, get the short SHA
# otherwise, just give up
branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \
git rev-parse --short HEAD 2> /dev/null || \
printf "(unknown)")"
[ -n "$s" ] && s=" [$s]"
printf "%s" "$1$branchName$s"
else
return
fi
}
set_prompts() {
local bold=$(tput bold)
local reset=$(tput sgr0)
local base05=$(tput setaf 188) # light grey
local base08=$(tput setaf 210) # red
local base0A=$(tput setaf 221) # yellow
local base0B=$(tput setaf 114) # green
if git rev-parse --git-dir >/dev/null 2>&1; then
# check for uncommitted changes in the index
if ! git diff-index --quiet --cached HEAD --ignore-submodules -- >&2; then
branchStyle=$base08
# check for unstaged changes
elif ! git diff-files --quiet --ignore-submodules -- >&2; then
branchStyle=$base0A
else
branchStyle=$base0B
fi
fi
PS1+="\$(prompt_git \"$bold$base05 on $branchStyle\")" # git repository details
export PS1
}
set_prompts
unset set_prompts
答案 0 :(得分:2)
解决任何问题的一个好方法是将其减少到重现您所看到的问题所需的最小代码段。这使得调试更容易,其他人更容易阅读和解决,并使其他用户可以从中受益。
例如,如果您查看问题,您会看到:
现在我们可以使用一个小代码示例来编写一个问题,该代码样本可以准确显示错误:
我希望以下代码在
cd /tmp
时显示“in / tmp”,但提示仍为空白。为什么不更新?
set_prompts() {
message=""
if [[ $PWD/ == /tmp/* ]]
then
message="in /tmp"
fi
PS1="\$(echo $message) \$"
}
set_prompts
unset set_prompts
此问题更易于阅读和回答:set_prompts
运行一次并计算$message
的值,然后取消设置并再也不执行。这就是消息永远不会改变的原因。
要使其正常工作,请确保在每次重新生成提示之前重新运行它。这可以通过PROMPT_COMMAND
:
set_prompts() {
PS1='\u@\h:\w ' # <-- Reset PS1 before each run
message=""
if [[ $PWD/ == /tmp/* ]]
then
message="in /tmp"
fi
PS1="\$(echo $message) \$"
}
PROMPT_COMMAND='set_prompts' # <-- Run function before every prompt
这可以按预期工作,并且可以很容易地适应您实际的长段代码。
答案 1 :(得分:0)
并非所有终端似乎都支持3位数字,但有些仅限于在man terminfo中声明的便携式8种颜色:
Color #define Value RGB
black COLOR_BLACK 0 0, 0, 0
red COLOR_RED 1 max,0,0
green COLOR_GREEN 2 0,max,0
yellow COLOR_YELLOW 3 max,max,0
blue COLOR_BLUE 4 0,0,max
magenta COLOR_MAGENTA 5 max,0,max
cyan COLOR_CYAN 6 0,max,max
white COLOR_WHITE 7 max,max,max
所以,我认为你的问题是使用更高的颜色数字。您可以输出终端的颜色表,如下所示:
( x=`tput op` y=`printf %$((${COLUMNS}-6))s`;for i in {0..256};do o=00$i;echo -e ${o:${#o}-3:3} `tput setaf $i;tput setab $i`${y// /=}$x;done; )