首页 > 解决方案 > 如何在仍然拥有自定义 PROMPT_COMMAND 的同时显示 pipenv 工作区?

问题描述

默认情况下,当我进入 pipenv shell 时,提示符的开头表示我正在工作的工作区。

user@user-dsktp:~/main$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
user@user-dsktp:~/main$ . /home/user/.local/share/virtualenvs/main-GqtUWnwk/bin/activate
(main-GqtUWnwk) user@user-dsktp:~/main$

但是,如果我自定义我的提示(以显示 git 信息):

PROMPT_COMMAND='__git_ps1 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]" "\n\\\$ "'

我丢失了工作区信息:

user@user-dsktp:~/main (develop=)
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.

user@user-dsktp:~/main (develop=)
$ . /home/user/.local/share/virtualenvs/main-GqtUWnwk/bin/activate

user@user-dsktp:~/main (develop=)
$ 

有谁知道如何找回它?非常感谢任何帮助。

标签: bashpipenv

解决方案


来自GNU Bash 参考手册

如果设置,该值将被解释为在打印每个主要提示 ( ) 之前要执行的命令$PS1

在您的情况下,您在打印之前运行__git_ps1带有参数的函数。"\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]" "\n\\\$ "$PS1

是什么__git_ps1?这取决于您的环境(它不是标准的 Bash 函数),但它是一个帮助函数,可以生成带有 Git 信息的 PS1。你可以看到它是什么

$ type __git_ps1

如果您查看源代码,您可能会发现__git_ps1 覆盖了默认的 PS1。这就是未显示虚拟环境名称的原因。正如@chepner 所提到的,虚拟环境的名称通过activate脚本通过修改您的PS1. __git_ps1但是,会覆盖该更改。

一劳永逸地解决它的方法是学习一些 Bash,并尝试制作更好的PROMPT_COMMAND:) 或者你可以使用它来代替

export PROMPT_COMMAND='
  __PS1_SUFFIX="\\\$ "
  if [[ -n "$VIRTUAL_ENV" ]]; then
    __PS1_SUFFIX="($(basename "$VIRTUAL_ENV")) $__PS1_SUFFIX"
  fi
  __git_ps1 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]" "\n$__PS1_SUFFIX"
'

此代码段检查是否VIRTUAL_ENV已设置(如果由 virtualenv 设置,这将指向虚拟环境的根),并将其名称添加到提示符的第二行(before $)。现在这不是最好的方法,因为目录名称并不总是与提示匹配,但它现在应该适合您。如果您发现此代码段不足以满足您的用例,您可以自行决定是否深入此 Bash 脚本的深渊。


推荐阅读