【问题标题】:Getting a gitprompt to run when executing commands执行命令时让 gitprompt 运行
【发布时间】:2011-12-14 00:37:11
【问题描述】:

在 bash 中,我使用 gitprompt 来显示我的 git 存储库的当前状态,所以我的 PS0 看起来像这样:[时间][存储库名称][当前路径][添加/修改文件的数量]$ 这是在 ~/.bashrc 中设置的,我将在其中导出 PROMPT_COMMAND

export PROMPT_COMMAND=$PROMPT_COMMAND';export PS1=$(gitprompt.pl c=\+ u=\~ f=\* A=\^ B=\\\\ F=\ \>\> statuscount=1)'

我也在使用屏幕(这可能会在这个问题中发挥作用)。当我创建一个新的屏幕窗口时,它会自动获取 .bashrc,因此我的 PS0 会使用该 repo 的最新 git 状态更新,不幸的是,这是我的 PS0 唯一一次使用 git 状态更新。

我该如何设置,以便每次在终端中运行命令或仅在某些命令上运行时,我的 git 状态都会更新?

我只需要在关闭文件、移动、删除或复制时运行 git status;因此,如果我可以将提示设置为仅在这些命令上运行,那将是最好的,但我会接受它在每个 bash 命令上运行(不将其绑定到我的返回键)。

这是我在 ~/.bashrc 中的整个提示

export PS0='\[\e[0;32m\][\t]\[\e[1m\][\h]\[\e[0;1m\][\w]\[\e[30;1m\]%{\[\e[1;32m\][%b]\[\e[0m\][%c%u%f%t]%}%{[%B%A%F]%}\[\e[0m\]\u\$ '
PS1=$(gitprompt.pl c=\+ u=\~ f=\* A=\^ B=\\\\ F=\ \>\> statuscount=1)
export PROMPT_COMMAND=$PROMPT_COMMAND';export $PS1'

【问题讨论】:

  • 你能告诉我们你的 bashrc 中设置 PS0 的实际行吗?
  • 刚刚添加了我用于提示的所有 3 行。

标签: git bash command-line command-prompt


【解决方案1】:

在我看来,您遇到的问题是您已经在单引号内,因此它不想再次解析该命令。应该可以通过将 PS1 赋值放在 bash 函数中然后设置 PROMPT_COMMAND 来解决这个问题:

function prompt_command() {
    PS1='$(gitprompt.pl c=\+ u=\~ f=\* A=\^ B=\\\\ F=\ \>\> statuscount=1)'
}

export PROMPT_COMMAND=prompt_command

也可以将你的gitprompt.pl 脚本放在一个函数中并返回你需要的结果,这样它就只会打印一个在 git 存储库中的结果。 这可以通过类似于以下的方式来实现:

export PS1='\[\e[1;37m\][\[\e[1;32m\]\h\[\e[1;37m\]:\[\e[1;36m\]\w\[\e[1;37m\]]$(parse_git_branch)$ \[\e[0m\]'

parse_git_branch() {
    BRANCH=$( git branch --no-color 2> /dev/null )
    # only run the gitprompt script if we're in a git repository
    if [ -n "$BRANCH" ]; then
        GITPROMPT=$(gitprompt.pl c=\+ u=\~ f=\* A=\^ B=\\\\ F=\ \>\> statuscount=1)
        printf "\e[1;33m[$GITPROMPT]\e[1;37m"
    fi
}

(注意:这是未经测试的,可能需要一些调整)

【讨论】:

    【解决方案2】:

    你想要这样的东西:

    PS1="\$(gitprompt.pl) "
    

    即:通过转义命令扩展来防止立即评估 gitprompt.pl。

    这样,只要需要显示 PS1,就会评估您的 $(gitprompt.pl)。

    【讨论】:

    • 好的,差不多了。当我在我的 PS1 周围添加引号以防止立即评估时,我的提示会立即更新,但该行未解析(即我的颜色都不存在)显示如下: [\e[0;32m][\t][ \e[1m][\h][\e[0;1m][\w][\e[30;1m][\e[1;32m][主][\e[0m][*11] [\e[0m]\u\$ 而不是:[14:02:43][Repo][/var/www/devsites/francis/site][master][*11]$ 你可以在第一个( unparsed) 版本,[master] 和 [*11] 都是正确的,但是缺少路径和时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2020-09-03
    相关资源
    最近更新 更多