Не удается увидеть имя виртуальной среды 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Блоки кода, вероятно, можно было бы улучшить, но мне это помогло.