Невозможно отменить PS1 с помощью direnv

Я слежу за вики Direnv на 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) $

Я не уверен, как должно работать решение в вики, поскольку, по-видимому, значение PS1 установлено на DEFAULT_PS1, когда .bashrc файл загружается в первый раз и не переоценивается как часть direnv крючок.

Как я могу изменить значение PS1 с помощью direnv?

1 ответ

В вики direnv упоминается, что автору пришлось «занести PS1 в черный список как переменную среды, которую можно изменить», главным образом потому, что «основная проблема заключается в том, что PS1 является локальной переменной». Поэтому я не думаю, что обходные пути, связанные с использованием файла для косвенного изменения, могут работать.

У меня была аналогичная проблема с виртуальными средами Python, которая, как я понимаю, отличается от вашего варианта использования, но в этом блоге есть пример , который может быть полезен.

Поскольку ссылки могут умереть, я привожу это здесь:

  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в файл, который удаляет любую ошибку о direnv: PS1 cannot be exported...и я могу подтвердить, что это также работает с этим сценарием.

Возможно, вы можете сделать что-то подобное; использовать .envrcчтобы экспортировать переменные среды, как вы делаете, но удалите строку export CUSTOM_PS1='$(kube_ps1) $ 'и в вашем ~/.bashrcсделать функцию, которая проверяет, установили ли вы KUBE_PS1_ENABLEDи добавляет '$(kube_ps1) $ 'к PS1если он установлен.

Другие вопросы по тегам