无法使用direnv覆盖PS1

时间:2019-10-21 14:05:37

标签: direnv

我正在关注direnv wiki on PS1。我的文件中包含以下相关条目。

.bashrc

DEFAULT_PS1='\[$(ppwd)\]\u@\h:\w$(__git_ps1 " (%s)")'
# add some more things to DEFAULT_PS1, conditionally
DEFAULT_PS1+='> '

PS1=${CUSTOM_PS1:-$DEFAULT_PS1}

# optional bashrc file extensions
for f in ~/.bashrc_*; do test -s $f && . $f || true; done

eval "$(direnv hook bash)"

.envrc

export KUBECONFIG=~/.config/kube/homelab.yaml
export KUBE_PS1_ENABLED=on
export CUSTOM_PS1='$(kube_ps1) $ '
PATH_add scripts

我允许将.envrc的最新版本与direnv allow一起使用。但是,当切换到目录时,虽然值似乎是正确的,但未设置自定义PS1值

$ cd -
/home/robert/sources/oss/sling-cloud-native
direnv: loading .envrc
direnv: export +CUSTOM_PS1 +KUBE_PS1_ENABLED ~KUBECONFIG ~PATH

$ echo $PS1
\[$(ppwd)\]\u@\h:\w$(__git_ps1 " (%s)")$(kube_ps1)>

$ echo $CUSTOM_PS1
$(kube_ps1) $

我不确定Wiki中的解决方案应该如何工作,因为显然在第一次加载.bashrc文件时PS1的值设置为DEFAULT_PS1,并且没有作为一部分进行重新评估。 direnv钩子的位置。

如何使用direnv更改PS1的值?

1 个答案:

答案 0 :(得分:1)

direnv wiki 中提到作者不得不“将 PS1 作为可以更改的环境变量列入黑名单”,主要是因为“核心问题是 PS1 是一个局部变量”。因此,我认为涉及使用 .envrc 文件间接修改 PS1 的解决方法行不通。

我在 Python 虚拟环境中遇到了类似的问题,我意识到这与您的用例不同,但 this blog 中有一个示例可能会有所帮助。

因为链接可能会死我在这里复制它:

  1. 将以下内容添加到 ~/.bashrc(我:我用 ~/.zshrc 测试了它,它也可以工作)
show_virtual_env() {
  if [[ -n "$VIRTUAL_ENV" && -n "$DIRENV_DIR" ]]; then
    echo "($(basename $VIRTUAL_ENV))"
  fi
}
export -f show_virtual_env
PS1='$(show_virtual_env)'$PS1
  1. 然后再次获取文件
source ~/.bashrc

维基还​​提到将 unset PS1 添加到 .envrc 文件中,这会消除有关 direnv: PS1 cannot be exported... 的任何错误,我可以确认这也适用于这种情况。

也许你可以做一些类似的事情;使用 .envrc 导出环境变量,但删除行 export CUSTOM_PS1='$(kube_ps1) $ ' 并在您的 ~/.bashrc 中创建一个函数来检查您是否已设置 KUBE_PS1_ENABLED 并附加 { {1}} 到 '$(kube_ps1) $ '(如果已设置)。