Ubuntu WSL의 Bash를 사용하려면 pyenv를 초기화하려면 다시 시작해야 합니다.

Ubuntu WSL의 Bash를 사용하려면 pyenv를 초기화하려면 다시 시작해야 합니다.

WSL의 Ubuntu 20.04에서 작지만 매우 이상한 pyenv 문제가 발생했습니다. 쉘을 시작한 다음 가상 환경을 활성화하려고 하면 여기에 설명된 것과 동일한 문제가 발생합니다.https://stackoverflow.com/questions/45577194/failed-to-activate-virtualenv-with-pyenv?newreg=6d05e39c69f747f1aa0665f00ed129b7

하지만 ~/.bashrc에 설명된 대로 설정했습니다.문서, virtualenv를 사용하여 셸을 다시 시작하면 exec $SHELL제대로 작동합니다. 이로 인해 ~/.bashrc가 어떤 이유에서든 새 창을 열 때 실행되지 않는다고 생각하게 되었지만 확인해 보니 그런 것 같습니다. Homebrew를 사용하여 pyenv 및 pyenv-virtualenv를 설치했습니다.

새로 열린 셸에서는 virtualenv가 로드되지 않지만 다시 시작한 후에는 로드되는 이유는 무엇입니까?

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

# add files to path
alias atom="/mnt/c/Windows/System32/cmd.exe /c 'atom'"

if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
  eval "$(pyenv virtualenv-init -)"
fi

답변1

쉘을 호출하는 방법에는 여러 가지가 있습니다. 이러한 유형의 셸을 터미널 에뮬레이터(예: WSL 시작 시)를 사용하거나 SSH를 통해 시스템에 로그인할 때 로그인 셸이라고 합니다. 로그인 쉘인지 여부에 관계없이 시작하고 명령을 입력하는 모든 쉘을 대화형 쉘이라고 합니다. 비대화형 쉘은 스크립트를 작성하거나 명령을 입력하지 않는 데 사용되는 쉘입니다.

WSL을 시작하면 로그인 셸이지만 exec bash또는 를 실행하면 exec $SHELL비로그인 대화형 셸입니다. WSL을 시작한 후 즉시 실행하면 동일한 문제가 발생할 것으로 생각됩니다. exec $SHELL -lWSL은 비로그인 대화형 셸 대신 로그인 셸을 시작합니다.

Bash의 경우 ~/.bashrcSSH에서 제공되지 않는 로그인 쉘은 읽혀지지 않습니다 ~/.bash_profile. 구성을 반복하고 싶지 않기 때문에 일반적으로 다음과 같은 내용을 추가하여 ~/.bash_profile읽습니다.~/.bashrc

# include .bashrc if it exists
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

~/.bashrc이렇게 하면 WSL을 처음 시작할 때 읽을 수 있으며 virtualenv 코드가 제대로 작동해야 합니다.

답변2

다른 문제가 있었고 모든 것이 제대로 작동하려면 WSL2를 다시 시작해야 했습니다.

해결책은 비활성화하는 것입니다.Windows가 빠르게 시작됩니다.

분명히 빠른 부팅 중에 때로는 WSL (default)대신 초기화됩니다.WSL2

아래에서 비활성화할 수 있습니다."전원 옵션">"전원 버튼의 기능을 선택하세요">"종료 설정">"빠른 시작 켜 줘"

관련 정보