#!/usr/bin/env bash # Summary: Configure the shell environment for pyenv # Usage: eval "$(pyenv init [-|--path] [--no-rehash] [])" set -e [ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then echo - echo --path echo --no-rehash echo bash echo fish echo ksh echo zsh exit fi mode="help" no_rehash="" for args in "$@" do if [ "$args" = "-" ]; then mode="print" shift fi if [ "$args" = "--path" ]; then mode="path" shift fi if [ "$args" = "--no-rehash" ]; then no_rehash=1 shift fi done shell="$1" if [ -z "$shell" ]; then shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)" shell="${shell%% *}" shell="${shell##-}" shell="${shell:-$SHELL}" shell="${shell##*/}" shell="${shell%%-*}" fi root="${0%/*}/.." function main() { case "$mode" in "help") help_ exit 1 ;; "path") print_path exit 0 ;; "print") init_dirs warn_path print_env print_completion print_shell_function exit 0 ;; esac # should never get here exit 2 } function help_() { case "$shell" in bash ) profile='~/.bash_profile' rc='~/.bashrc' ;; zsh ) profile='~/.zprofile' rc='~/.zshrc' ;; ksh ) profile='~/.profile' rc='~/.profile' ;; * ) profile='your shell'\''s login startup file' rc='your shell'\''s interactive startup file' ;; esac { echo echo '# (The below instructions are intended for common' echo '# shell setups. See the README for more guidance' echo '# if they don'\''t apply and/or don'\''t work for you.)' echo case "$shell" in fish ) echo "# Add pyenv executable to PATH by running" echo "# the following interactively:" echo echo 'set -Ux PYENV_ROOT $HOME/.pyenv' echo 'set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths' echo echo "# Load pyenv automatically by appending" echo "# the following to ~/.config/fish/config.fish:" echo echo 'status is-interactive; and pyenv init --path | source' echo 'pyenv init - | source' echo echo "# If fish is not your login shell," echo "# add the following to ~/.profile:" echo echo 'export PYENV_ROOT="$HOME/.pyenv"' echo 'export PATH="$PYENV_ROOT/bin:$PATH"' echo 'eval "$(pyenv init --path)"' echo ;; * ) echo '# Add pyenv executable to PATH and' echo '# enable shims by adding the following' case "$shell" in bash|ksh ) echo '# to ~/.profile:' ;; * ) echo '# to ~/.profile and '"${profile}"':' ;; esac echo echo 'export PYENV_ROOT="$HOME/.pyenv"' echo 'export PATH="$PYENV_ROOT/bin:$PATH"' echo 'eval "$(pyenv init --path)"' echo if [[ $shell == "bash" ]]; then echo '# If your ~/.profile sources '"${rc}"',' echo '# the lines need to be inserted before the part' echo '# that does that. See the README for another option.' echo echo '# If you have '"${profile}"', make sure that it' echo '# also executes the above lines -- e.g. by' echo '# copying them there or by sourcing ~/.profile' echo fi echo "# Load pyenv into the shell by adding" echo "# the following to ${rc}:" echo echo 'eval "$(pyenv init -)"' echo echo '# Make sure to restart your entire logon session' echo '# for changes to profile files to take effect.' echo ;; esac } >&2 } function init_dirs() { mkdir -p "${PYENV_ROOT}/"{shims,versions} } function print_path() { # Need to use the login shell rather than the current one case "$shell" in fish ) echo "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" ;; * ) echo 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' ;; esac } function warn_path() { if ! [[ ":${PATH}:" == *":${PYENV_ROOT}/shims:"* ]] ; then echo 'echo '\''WARNING: `pyenv init -` no longer sets PATH.'\' echo 'echo '\''Run `pyenv init` to see the necessary changes to make to your configuration.'\' fi } function print_env() { case "$shell" in fish ) echo "set -gx PYENV_SHELL $shell" ;; * ) echo "export PYENV_SHELL=$shell" ;; esac } function print_completion() { completion="${root}/completions/pyenv.${shell}" if [ -r "$completion" ]; then echo "source '$completion'" fi if [ -z "$no_rehash" ]; then echo 'command pyenv rehash 2>/dev/null' fi } function print_shell_function() { commands=(`pyenv-commands --sh`) case "$shell" in fish ) cat <