
___x_cmd_env_var_recover(){
    if [ "$#" -eq 0 ]; then
        ___x_cmd_env_var_recoverall
    else
        ___x_cmd_env_var_recover___multiple "$@"
    fi
}

___x_cmd_env_var_recover___all(){
    local var
    ___x_cmd_env_var_ls | while read -r var; do
        case "$var" in
            "")     ;;
            *=)     eval unset "${var%=*}" ;;
            *)      eval "${var}=\"\$___X_CMD_ENV_VAR___BACKUP_${var}\"" ;;
        esac
    done
    ___X_CMD_ENV_VAR_LIST=
}

___x_cmd_env_var_recoverall(){
    ___x_cmd_env_var_recover___all
}

___x_cmd_env_var_recover___multiple(){
    while [ $# -gt 0 ]; do
        ___x_cmd_env_var_recover___one "$1"
        shift
    done
}

___x_cmd_env_var_recover___one(){
    [ -n "$1" ] || M='Provide varname' N=env log:ret:1
    local varname_bak="___X_CMD_ENV_VAR___BACKUP_${1}"
    if ___x_cmd_env_var_recover___rm "${1}"; then
        eval "$1=\"\$${varname_bak}\""
    elif ___x_cmd_env_var_recover___rm "$1="; then
        eval "unset $1"
    else
        env:error "Variable Not trackcing"
        return 1
    fi
    eval unset "$varname_bak"
}

___x_cmd_env_var_recover___rm(){
    [ -n "$1" ] || M='Provide varname' N=env log:ret:1
    local tmp="${___X_CMD_ENV_VAR_LIST#*
"${1}"
}"
    if [ "$tmp" != "$___X_CMD_ENV_VAR_LIST" ]; then
        ___X_CMD_ENV_VAR_LIST="${___X_CMD_ENV_VAR_LIST%%
"$1"
*}
${tmp}"
        return 0
    fi
    return 1
}
