我正在关注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的值?
答案 0 :(得分:1)
direnv wiki 中提到作者不得不“将 PS1 作为可以更改的环境变量列入黑名单”,主要是因为“核心问题是 PS1 是一个局部变量”。因此,我认为涉及使用 .envrc
文件间接修改 PS1
的解决方法行不通。
我在 Python 虚拟环境中遇到了类似的问题,我意识到这与您的用例不同,但 this blog 中有一个示例可能会有所帮助。
因为链接可能会死我在这里复制它:
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
并附加 { {1}} 到 '$(kube_ps1) $ '
(如果已设置)。