터미널 프롬프트에서 conda env 변수를 수정하는 방법은 무엇입니까?

터미널 프롬프트에서 conda env 변수를 수정하는 방법은 무엇입니까?

터미널 프롬프트를 사용자 정의하고 싶습니다. 일반적으로 conda 환경을 활성화할 때 환경 이름이 PS1 문자열 앞에 추가됩니다. 이것을 더 맞춤설정하고 싶지만 알 수 없습니다.

changeps1: false이것을 파일 에 추가하면 .condarc새 환경을 활성화할 때 터미널 프롬프트가 수정되지 않습니다. 그런 다음 다음과 같이 환경 변수를 수정할 수 있습니다 .bash_profile.

PS1+="\[${cyan}\]<$(basename $CONDA_DEFAULT_ENV)> ";

이것은 당근으로 둘러싸여 있기를 원하는 것과 동일한 색상의 환경 이름을 반환하지만 이는 source .bash_profile환경을 활성화한 후에만 작동하며 아무런 효과가 없으며 이는 놀라운 일이 아닙니다.

제 질문은 환경을 활성화할 때 프롬프트를 업데이트하는 방법입니까, 아니면 이 문제를 해결하는 더 좋은 방법이 있습니까?

이는 다음과 관련이 있습니다.이 문제

샘플 구성 파일그러나 프롬프트가 변경되지 않은 환경을 활성화할 때 발생하는 문제는 직접적으로 해결되지 않습니다.

답변1

여기서 문제는 큰따옴표를 사용하고 직접적인 명령 대체를 사용한다는 것입니다. 즉, $(basename $CONDA_DEFAULT_ENV)해당 $CONDA_DEFAULT_ENV코드 줄이 실행될 때 문자열 값이 한 번만 평가되고 그대로 PS1 문자열에 병합됩니다.

bash가 PS1을 처리하는 방식에서는 $(...)프롬프트가 인쇄될 때마다 시퀀스가 ​​평가되므로 해야 할 일은 시퀀스를 리터럴 형식으로 유지하는 것입니다( $예: 백슬래시로 s를 이스케이프 처리). 그러면 원하는 결과가 생성됩니다. .

그래서 이것은 작동합니다 :

PS1+="\[${cyan}\]<\$(basename \$CONDA_DEFAULT_ENV)> ";

basename또는 공백이 있거나 비어 있거나 설정되지 않은 경우 에도 명령이 계속 작동하도록 변수 주위에 큰따옴표를 추가하는 것이 더 좋습니다 .$CONDA_DEFAULT_ENV

PS1+="\[${cyan}\]<\$(basename \"\$CONDA_DEFAULT_ENV)\"> ";

${cyan}변경될 것으로 예상되지 않으므로 한 번만 평가해도 괜찮기 때문에 탈출하지 않습니다 .

이스케이프 메타 문자(예: $")는 어느 시점에서 번거로워지기 시작하므로 어느 시점에서는 작은따옴표를 사용하여 문자열 리터럴을 유지하는 것이 더 나은 옵션이 될 수 있습니다. 그러나 우리는 여전히 확장을 원하므로 ${cyan}최소한의 이스케이핑으로 원하는 결과를 얻기 위해 큰따옴표와 작은따옴표를 혼합해 보겠습니다.

PS1+="\[${cyan}\]"'<$(basename "$CONDA_DEFAULT_ENV")> ';

마지막에 색상을 재설정하지 않고 청록색으로 설정하는 데 여전히 문제가 있을 수 있습니다. 하지만 "\[${...}\]"형식을 재설정하는 코드와 함께 끝에 다른 블록을 추가하면 쉽게 해결할 수 있습니다(색상 상수가 어디에 있는지 확실하지 않음). 어디에서)가 발생하므로 해당 재설정 코드를 확인하세요. ) 그러나 특정 환경에서는 이것이 문제가 되지 않을 수 있습니다. PS1을 추가로 수정하기 위해 더 많은 라인을 추가하면 해당 라인의 색상도 변경됩니다. (당신이 프로필을 가져올 때마다 당신이 가지고 있는 것이 유효하다고 말했기 때문에 이것이 당신의 경우라고 가정합니다.)

답변2

filbranden의 답변을 조금 확장하여 환경이 설정되지 않았을 때 <>를 사용하지 않으려면 다음을 수행할 수 있습니다.

# CONDA
function parse_conda_env () {
    if [ ! -z "$CONDA_DEFAULT_ENV" ]
    then
        echo "<$(basename "$CONDA_DEFAULT_ENV")> "
    fi
}

# COLORS
BLUE="\[\033[0;34m\]"
RED="\[\033[0;31m\]"
YELLOW="\[\033[0;33m\]"
GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
NO_COLOR="\[\033[0m\]"

PROMPT_DIRTRIM=2
PS1="$CYAN\$(parse_conda_env)$GREEN\h$BLUE:\w$YELLOW\$(parse_git_branch)$NO_COLOR\$ ";

관련 정보