我怎样才能让这个脚本反映 PS1 上的分支状态?

How can I make this script reflect the branch status on PS1?

首先,我知道similar questions have been answered, some of them have even been marked as duplicate. I have read their answers, and while they've given me some insight regarding my problem, I still can't figure out how to fix my PS1. I've also tried reading a bit about UNIX quotes,但这也没有解决我的问题。

现在,进入实际问题:我已经使用自定义 PS1 一段时间了,它一直运行良好。就是这个:

SEPARATOR="$WHITEBOLD-"
USER_AND_DOMAIN="$GREENBOLD[$GRAY\u$WHITEBOLD@$GRAY\h$GREENBOLD]"
WORKING_DIR="$GREENBOLD[$YELLOW\w$GREENBOLD]"

export PS1="$USER_AND_DOMAIN$SEPARATOR$WORKING_DIR $WHITEBOLD\t\n$RED>$WHITE "

但是,我觉得有必要将我当前的 git 分支添加到其中,并在网上找到了几个解决方案。 One of them really caught my interest,因为它会根据我的工作目录是否脏来改变分支名称的颜色。然后我开始尝试使其适应我当前现有的定制,目前它看起来像这样:

SEPARATOR="$WHITEBOLD-"
USER_AND_DOMAIN="$GREENBOLD[$GRAY\u$WHITEBOLD@$GRAY\h$GREENBOLD]"
WORKING_DIR="$GREENBOLD[$YELLOW\w$GREENBOLD]"

GIT_BRANCH="$(git branch &>/dev/null;\
if [ $? -eq 0 ]; then \
  echo "$(echo `git status` | grep 'not staged for commit' > /dev/null 2>&1; \
  if [ "$?" -eq "0" ]; then \
    # Changes to working tree
    echo "$SEPARATOR$GREENBOLD[$RED$(__git_ps1 "%s")$GREENBOLD]"; \    
  else \
    # Clean repository - nothing to commit
    echo "$SEPARATOR$GREENBOLD[$GREEN$(__git_ps1 "%s")$GREENBOLD]"; \
  fi)"; \
fi)"

export PS1="$USER_AND_DOMAIN$SEPARATOR$WORKING_DIR$GIT_BRANCH $WHITEBOLD\t\n$RED>$WHITE "

然而,虽然当我导航到另一个分支时它确实改变了分支名称,分支颜色不会自动改变 - 只有当我重新获取脚本(它是 ~/.ps1_setup 下的单独脚本,在 ~/.bashrc 内调用)。根据我的阅读,它与单引号和双引号的使用有关,但我见过的大多数示例都比这段代码简单得多,而且我一直在尝试 fiddle最后 2 小时,每次都得到不同的结果,但大多数都是乱码的转义格式标签打印。

同样,我知道这与之前已经问过和回答过的问题有些相关,但是给出的答案不足以让我解决这个问题,所以我很抱歉问 'again'。感谢您的帮助,好人! :)

我不是 bash 专家,但我认为问题在于您将原始 single-quotes 切换为 double-quotes,而 bash 处理这些的方式非常不同: double-quotes 执行变量和命令替换,而 single-quotes 不执行。

试试这个:

export PS1="$USER_AND_DOMAIN$SEPARATOR$WORKING_DIR"'$(git branch &>/dev/null;\
if [ $? -eq 0 ]; then \
  echo "$(echo `git status` | grep "nothing to commit" > /dev/null 2>&1; \
  if [ "$?" -eq "0" ]; then \
    # @4 - Clean repository - nothing to commit
     echo "'$SEPARATOR$GREENBOLD[$GREEN'"$(__git_ps1 "%s"); \
  else \
    # @5 - Changes to working tree
     echo "'$SEPARATOR$GREENBOLD[$RED'"$(__git_ps1 "%s"); \
  fi)"; \
fi)'"$GREENBOLD] $WHITEBOLD\t\n$RED>$WHITE"