我正在PS1上关注direnv wiki。我的文件中有以下相关条目。
.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 中的解决方案应该如何工作,因为显然 PS1 的值在第一次加载.bashrc
文件时设置为DEFAULT_PS1,并且不会作为direnv
钩子的一部分重新评估。
如何使用direnv
更改 PS1 的值?
direnv wiki 提到作者不得不"将 PS1 列入黑名单,将其作为可以更改的环境变量",主要是因为"核心问题是 PS1 是一个局部变量"。 因此,我认为涉及使用.envrc
文件间接修改PS1
的解决方法不起作用。
我在python虚拟环境中遇到了类似的问题,我意识到它与您的用例不同,但是此博客中有一个示例可能会有所帮助。
因为链接可能会死,所以我在这里重现它:
- 将以下内容添加到 ~/.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
- 然后再次获取文件
source ~/.bashrc
维基还提到将unset PS1
添加到.envrc
文件中,这消除了有关direnv: PS1 cannot be exported...
的任何错误,我可以确认这也适用于这种情况。
也许你可以做类似的事情;使用.envrc
像你正在做的那样导出环境变量,但删除行export CUSTOM_PS1='$(kube_ps1) $ '
,并在你的~/.bashrc
创建一个函数,检查你是否设置了KUBE_PS1_ENABLED
,并将'$(kube_ps1) $ '
附加到PS1
是否设置了。