# non-interactive activate __activate_env() { for func in $(typeset -F | cut -f 3 -d ' ' | grep -E '^__env_'); do if [[ "$func" == "__env_$1" ]]; then $func echo "Activated $1" return 0 fi done echo "Error: Environment not found $1" >&2 return 1 } # print all defined envs list_envs() { for env in $(typeset -F | sed -n -e 's/^declare -f __env_//p'); do active=false for env_active in $ENV_ACTIVE; do if [ "$env_active" == "$env" ]; then active=true fi done if $active; then echo -n "${env}* " else echo -n "$env " fi done echo "" } plain_list_envs() { typeset -F | sed -n -e 's/^declare -f __env_//p' } # Interactive activate activate() { err=false for env in $*; do if ! typeset -F | grep -q -E "^declare -f __env_${env}$"; then echo "Environment not defined: $env" err=true fi done if $err; then return 1 fi for env in $*; do if typeset -F | grep -q -E "^declare -f __env_${env}$"; then export ENV_ACTIVE="$ENV_ACTIVE${ENV_ACTIVE:+ }$env" __env_${env} fi done echo "Active: $ENV_ACTIVE" } # initialization for env_request in $ENV_ACTIVE; do __activate_env $env_request done # bash-completion for `activate' _activate() { _init_completion -s || return COMPREPLY=( $(compgen -W "$(list_envs)" -- $cur) ) } && complete -F _activate activate