Не удается увидеть имя виртуальной среды python в приглашении bash, когда PROMPT_COMMAND используется для изменения PS1

Я сократил свое приглашение bash, добавив следующий блок кода в ~/.bashrcфайл.

      get_PS1(){
    local pwdmaxlen=30
    local trunc_symbol="\[$(tput setaf 1)$(tput bold)\]..."
    
    if [[ "${#PWD}" -gt "$pwdmaxlen" ]]; then
        local right_chunk="\[$(tput setaf 4)$(tput bold)\]${PWD:$((${#PWD}-$pwdmaxlen)):${#PWD}}\[$(tput sgr0)\]"
        PS1="${trunc_symbol}${right_chunk} \$ "
    else
        PS1="\[$(tput setaf 4)$(tput bold)\]\$(pwd) \$\[$(tput sgr0)\] "
    fi
}

PROMPT_COMMAND=get_PS1

Когда он активен, я имею в виду после exec bash, если я создам виртуальную среду с virtualenv venvи впоследствии активировать его с помощью source venv/bin/activate, (venv)должен был появиться в начале приглашения bash. Нет никакого способа понять, что я запускаю виртуальную среду, хотя which pythonна самом деле показывает, что я нахожусь в виртуальной среде.

Насколько я понимаю, это происходит только тогда, когда я использую PROMPT_COMMANDпеременная. Неважно, какую модификацию я сделал внутри get_PS1функция, она всегда будет вести себя так. я знаю PROMPT_DIRTRIMспособ, но это не то, что я ищу.

Баш версия 5.0.17(1)-release. У меня Kubuntu 20.04.3 LTS.

Кстати, этот кодовый блок я узнал отсюда .

Спасибо. Дайте мне знать, если потребуется какая-либо другая информация.

1 ответ

Это можно сделать с помощью переменной. Когда виртуальная среда, например. envактивирован, его путь сохраняется в VIRTUAL_ENVи можно увидеть с echo $VIRTUAL_ENV.

Теперь отформатируйте, отфильтруйте и сохраните имя виртуальной среды следующим образом:

      local virt_env=`printf "($(echo $VIRTUAL_ENV | awk -F "/" '{print $NF}'))"`;

После этого допишите virt_envпеременная к PS1когда требуется. После добавления новой логики get_PS1будет выглядеть так:

      get_PS1(){
    local pwdmaxlen=30
    local trunc_symbol="\[$(tput setaf 1)$(tput bold)\]..."
    local virt_env=`printf "($(echo $VIRTUAL_ENV | awk -F "/" '{print $NF}'))"`;

    if [[ "${#PWD}" -gt "$pwdmaxlen" ]]; then
        local right_chunk="\[$(tput setaf 4)$(tput bold)\]${PWD:$((${#PWD}-$pwdmaxlen)):${#PWD}}\[$(tput sgr0)\]";
        if [[ -n "$VIRTUAL_ENV" ]]; then
            PS1="${virt_env} ${trunc_symbol}${right_chunk} \$ ";
        else
            PS1="${trunc_symbol}${right_chunk} \$ ";
        fi
    else
        if [[ -n "$VIRTUAL_ENV" ]]; then
            PS1="${virt_env} \[$(tput setaf 4)$(tput bold)\]\$(pwd) \$\[$(tput sgr0)\] ";
        else
            PS1="\[$(tput setaf 4)$(tput bold)\]\$(pwd) \$\[$(tput sgr0)\] ";
        fi
    fi
}

примечание: if-elseБлоки кода, вероятно, можно было бы улучшить, но мне это помогло.

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