升级rvm遇到的坑

最近要维护一个还有flutter的项目,起初项目编译不通过,检查了cocoapods号低于项目版本号。于是开启了一顿升级之路,最终卡在了rvm升级上,搜索了很多资料都没有解决,最后还是自己解决,分享出来让大家少走点弯路

  • 常规操作进行更新

    $ rvm get stable
      Downloading https://get.rvm.io
    Could not download rvm-installer, please report to https://github.com/rvm/rvm/issues
    

    我尝试几次都是报这个错误,起初我怀疑是网的问题、于是通过特殊手段通过浏览器可以访问到https://get.rvm.io,再次尝试更新还是报上面的错误。接下来尝试了各种骚操作,查了各种资料。最终无果

  • 仔细冷静的想了一下、升级的原理。于是想到了一个方案。

    • https://get.rvm.io这个网址的内容复制一下,自己创建一个sh文件

      #!/usr/bin/env bash
      
      shopt -s extglob
      set -o errtrace
      set -o errexit
      set -o pipefail
      
      rvm_install_initialize()
      {
        DEFAULT_SOURCES=(github.com/rvm/rvm bitbucket.org/mpapis/rvm)
      
        BASH_MIN_VERSION="3.2.25"
        if
          [[ -n "${BASH_VERSION:-}" &&
            "$(\printf "%b" "${BASH_VERSION:-}\n${BASH_MIN_VERSION}\n" | LC_ALL=C \sort -t"." -k1,1n -k2,2n -k3,3n | \head -n1)" != "${BASH_MIN_VERSION}"
          ]]
        then
          echo "BASH ${BASH_MIN_VERSION} required (you have $BASH_VERSION)"
          exit 1
        fi
      
        export HOME PS4
        export rvm_trace_flag rvm_debug_flag rvm_user_install_flag rvm_ignore_rvmrc rvm_prefix rvm_path
      
        PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
      }
      
      log()  { printf "%b\n" "$*"; }
      debug(){ [[ ${rvm_debug_flag:-0} -eq 0 ]] || printf "%b\n" "$*" >&2; }
      warn() { log "WARN: $*" >&2 ; }
      fail() { fail_with_code 1 "$*" ; }
      fail_with_code() { code="$1" ; shift ; log "\nERROR: $*\n" >&2 ; exit "$code" ; }
      
      rvm_install_commands_setup()
      {
        \which which >/dev/null 2>&1 || fail "Could not find 'which' command, make sure it's available first before continuing installation."
        \which grep >/dev/null 2>&1 || fail "Could not find 'grep' command, make sure it's available first before continuing installation."
        if
          [[ -z "${rvm_tar_command:-}" ]] && builtin command -v gtar >/dev/null
        then
          rvm_tar_command=gtar
        elif
          ${rvm_tar_command:-tar} --help 2>&1 | GREP_OPTIONS="" \grep -- --strip-components >/dev/null
        then
          rvm_tar_command="${rvm_tar_command:-tar}"
        else
          case "$(uname)" in
            (OpenBSD)
              log "Trying to install GNU version of tar, might require sudo password"
              if (( UID ))
              then sudo pkg_add -z gtar-1
              else pkg_add -z gtar-1
              fi
              rvm_tar_command=gtar
              ;;
            (Darwin|FreeBSD|DragonFly) # it's not possible to autodetect on OSX, the help/man does not mention all flags
              rvm_tar_command=tar
              ;;
            (SunOS)
              case "$(uname -r)" in
                (5.10)
                  log "Trying to install GNU version of tar, might require sudo password"
                  if (( UID ))
                  then
                    if \which sudo >/dev/null 2>&1
                    then sudo_10=sudo
                    elif \which /opt/csw/bin/sudo >/dev/null 2>&1
                    then sudo_10=/opt/csw/bin/sudo
                    else fail "sudo is required but not found. You may install sudo from OpenCSW repository (https://www.opencsw.org/about)"
                    fi
                    pkginfo -q CSWpkgutil || $sudo_10 pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil
                    sudo /opt/csw/bin/pkgutil -iy CSWgtar -t https://mirror.opencsw.org/opencsw/unstable
                  else
                    pkginfo -q CSWpkgutil || pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil
                    /opt/csw/bin/pkgutil -iy CSWgtar -t https://mirror.opencsw.org/opencsw/unstable
                  fi
                  rvm_tar_command=/opt/csw/bin/gtar
                  ;;
                (*)
                  rvm_tar_command=tar
                  ;;
              esac
          esac
          builtin command -v ${rvm_tar_command:-gtar} >/dev/null ||
          fail "Could not find GNU compatible version of 'tar' command, make sure it's available first before continuing installation."
        fi
        if
          [[ " ${rvm_tar_options:-} " != *" --no-same-owner "*  ]] &&
          $rvm_tar_command --help 2>&1 | GREP_OPTIONS="" \grep -- --no-same-owner >/dev/null
        then
          rvm_tar_options="${rvm_tar_options:-}${rvm_tar_options:+ }--no-same-owner"
        fi
      }
      
      usage()
      {
        printf "%b" "
      
      Usage
      
        rvm-installer [options] [action]
      
      Options
      
        [[--]version] <version>
      
          The version or tag to install. Valid values are:
      
            latest         - The latest tagged version.
            latest-minor   - The latest minor version of the current major version.
            latest-<x>     - The latest minor version of version x.
            latest-<x>.<y> - The latest patch version of version x.y.
            <x>.<y>.<z>    - Major version x, minor version y and patch z.
      
        [--]branch <branch>
      
          The name of the branch from which RVM is installed. This option can be used
          with the following formats for <branch>:
      
            <account>/
      
              If account is rvm or mpapis, installs from one of the following:
      
                https://github.com/rvm/rvm/archive/master.tar.gz
                https://bitbucket.org/mpapis/rvm/get/master.tar.gz
      
             Otherwise, installs from:
      
               https://github.com/<account>/rvm/archive/master.tar.gz
      
            <account>/<branch>
      
              If account is rvm or mpapis, installs from one of the following:
      
                https://github.com/rvm/rvm/archive/<branch>.tar.gz
                https://bitbucket.org/mpapis/rvm/get/<branch>.tar.gz
      
              Otherwise, installs from:
      
                https://github.com/<account>/rvm/archive/<branch>.tar.gz
      
            [/]<branch>
      
              Installs the branch from one of the following:
      
                https://github.com/rvm/rvm/archive/<branch>.tar.gz
                https://bitbucket.org/mpapis/rvm/get/<branch>.tar.gz
      
            [--]source <source>
      
              Defines the repository from which RVM is retrieved and installed in the format:
      
                <domain>/<account>/<repo>
      
              Where:
      
                <domain>  - Is bitbucket.org, github.com or a github enterprise site serving
                            an RVM repository.
                <account> - Is the user account in which the RVM repository resides.
                <repo>    - Is the name of the RVM repository.
      
              Note that when using the [--]source option, one should only use the [/]branch format
              with the [--]branch option. Failure to do so will result in undefined behavior.
      
            --trace
      
              Provides debug logging for the installation script.
      Actions
      
        master - Installs RVM from the master branch at rvm/rvm on github or mpapis/rvm
                 on bitbucket.org.
        stable - Installs RVM from the stable branch a rvm/rvm on github or mpapis/rvm
                 on bitbucket.org.
        help   - Displays this output.
      
      "
      }
      
      ## duplication marker 32fosjfjsznkjneuera48jae
      __rvm_curl_output_control()
      {
        if
          (( ${rvm_quiet_curl_flag:-0} == 1 ))
        then
          __flags+=( "--silent" "--show-error" )
        elif
          [[ " $*" == *" -s"* || " $*" == *" --silent"* ]]
        then
          # make sure --show-error is used with --silent
          [[ " $*" == *" -S"* || " $*" == *" -sS"* || " $*" == *" --show-error"* ]] ||
          {
            __flags+=( "--show-error" )
          }
        fi
      }
      
      ## duplication marker 32fosjfjsznkjneuera48jae
      # -S is automatically added to -s
      __rvm_curl()
      (
        __rvm_which curl >/dev/null ||
        {
          rvm_error "RVM requires 'curl'. Install 'curl' first and try again."
          return 200
        }
      
        typeset -a __flags
        __flags=( --fail --location --max-redirs 10 )
      
        [[ "$*" == *"--max-time"* ]] ||
        [[ "$*" == *"--connect-timeout"* ]] ||
          __flags+=( --connect-timeout 30 --retry-delay 2 --retry 3 )
      
        if [[ -n "${rvm_proxy:-}" ]]
        then __flags+=( --proxy "${rvm_proxy:-}" )
        fi
      
        __rvm_curl_output_control
      
        unset curl
        __rvm_debug_command \curl "${__flags[@]}" "$@" || return $?
      )
      
      rvm_error()  { printf "ERROR: %b\n" "$*"; }
      __rvm_which(){   which "$@" || return $?; true; }
      __rvm_debug_command()
      {
        debug "Running($#): $*"
        "$@" || return $?
        true
      }
      rvm_is_a_shell_function()
      {
        [[ -t 0 && -t 1 ]] || return $?
        return ${rvm_is_not_a_shell_function:-0}
      }
      
      # Searches the tags for the highest available version matching a given pattern.
      # fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.10. -> 1.10.3
      # fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.10. -> 1.10.3
      # fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.    -> 1.11.0
      # fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) ""    -> 2.0.1
      fetch_version()
      {
        typeset _account _domain _pattern _repo _sources _values _version
        _sources=(${!1})
        _pattern=$2
        for _source in "${_sources[@]}"
        do
          IFS='/' read -r _domain _account _repo <<< "${_source}"
          _version="$(
            fetch_versions ${_domain} ${_account} ${_repo} |
            GREP_OPTIONS="" \grep "^${_pattern:-}" | tail -n 1
          )"
          if
            [[ -n ${_version} ]]
          then
            echo "${_version}"
            return 0
          fi
        done
        fail_with_code 4 "Exhausted all sources trying to fetch version '$version' of RVM!"
      }
      
      # Returns a sorted list of most recent tags from a repository
      fetch_versions()
      {
        typeset _account _domain _repo _url
        _domain=$1
        _account=$2
        _repo=$3
        case ${_domain} in
          (bitbucket.org)
            _url="https://api.${_domain}/2.0/repositories/${_account}/${_repo}/refs/tags?sort=-name&pagelen=20"
            ;;
          (github.com)
            _url=https://api.${_domain}/repos/${_account}/${_repo}/tags
            ;;
      
          (*)
            _url=https://${_domain}/api/v3/repos/${_account}/${_repo}/tags
            ;;
        esac
      
        { __rvm_curl -sS "${_url}" || warn "...the preceeding error with code $? occurred while fetching $_url" ; } |
          \awk -v RS=',|values":' -v FS='"' '$2=="name"&&$4!="rvm"{print $4}' |
          sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n
      }
      
      install_release()
      {
        typeset _source _sources _url _version _verify_pgp
        _sources=(${!1})
        _version=$2
        debug "Downloading RVM version ${_version}"
        for _source in "${_sources[@]}"
        do
          case ${_source} in
            (bitbucket.org*)
              _url="https://${_source}/get/${_version}.tar.gz"
              _verify_pgp="https://${_source}/downloads/${_version}.tar.gz.asc"
              ;;
            (*)
              _url="https://${_source}/archive/${_version}.tar.gz"
              _verify_pgp="https://${_source}/releases/download/${_version}/${_version}.tar.gz.asc"
              ;;
          esac
          get_and_unpack "${_url}" "rvm-${_version}.tgz" "$_verify_pgp" && return
        done
        return $?
      }
      
      install_head()
      {
        typeset _branch _source _sources _url
        _sources=(${!1})
        _branch=$2
        debug "Selected RVM branch ${_branch}"
        for _source in "${_sources[@]}"
        do
          case ${_source} in
            (bitbucket.org*)
              _url=https://${_source}/get/${_branch}.tar.gz
              ;;
            (*)
              _url=https://${_source}/archive/${_branch}.tar.gz
              ;;
          esac
          get_and_unpack "${_url}" "rvm-${_branch//\//_}.tgz" && return
        done
        return $?
      }
      
      # duplication marker dfkjdjngdfjngjcszncv
      # Drop in cd which _doesn't_ respect cdpath
      __rvm_cd()
      {
        typeset old_cdpath ret
        ret=0
        old_cdpath="${CDPATH}"
        CDPATH="."
        chpwd_functions="" builtin cd "$@" || ret=$?
        CDPATH="${old_cdpath}"
        return $ret
      }
      
      get_package()
      {
        typeset _url _file
        _url="$1"
        _file="$2"
        log "Downloading ${_url}"
        __rvm_curl -sS ${_url} > ${rvm_archives_path}/${_file} ||
        {
          _return=$?
          case $_return in
            # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
            (60)
              log "
      Could not download '${_url}', you can read more about it here:
      https://rvm.io/support/fixing-broken-ssl-certificates/
      To continue in insecure mode run 'echo insecure >> ~/.curlrc'.
      "
              ;;
            # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
            (77)
              log "
      It looks like you have old certificates, you can read more about it here:
      https://rvm.io/support/fixing-broken-ssl-certificates/
      "
              ;;
            # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
            (141)
              log "
      Curl returned 141 - it is result of a segfault which means it's Curls fault.
      Try again and if it crashes more than a couple of times you either need to
      reinstall Curl or consult with your distribution manual and contact support.
      "
              ;;
            (*)
              log "
      Could not download '${_url}'.
        curl returned status '$_return'.
      "
              ;;
          esac
          return $_return
        }
      }
      
      # duplication marker flnglfdjkngjndkfjhsbdjgfghdsgfklgg
      rvm_install_gpg_setup()
      {
        export rvm_gpg_command
        {
          rvm_gpg_command="$( \which gpg2 2>/dev/null )" &&
          [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
        } || {
          rvm_gpg_command="$( \which gpg 2>/dev/null )" &&
          [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
        } || rvm_gpg_command=""
      
        debug "Detected GPG program: '$rvm_gpg_command'"
      
        [[ -n "$rvm_gpg_command" ]] || return $?
      }
      
      # duplication marker rdjgndfnghdfnhgfdhbghdbfhgbfdhbn
      verify_package_pgp()
      {
        if
          "${rvm_gpg_command}" --verify "$2" "$1"
        then
          log "GPG verified '$1'"
        else
          typeset _return=$?
      
          log "\
      GPG signature verification failed for '$1' - '$3'! Try to install GPG v2 and then fetch the public key:
      
          ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
      
      or if it fails:
      
          command curl -sSL https://rvm.io/mpapis.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -
          command curl -sSL https://rvm.io/pkuczynski.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -
      
      In case of further problems with validation please refer to https://rvm.io/rvm/security
      "
      
          exit ${_return}
        fi
      }
      
      verify_pgp()
      {
        [[ -n "${1:-}" ]] ||
        {
          debug "No PGP url given, skipping."
          return 0
        }
      
        get_package "$1" "$2.asc" ||
        {
          debug "PGP url given but does not exist: '$1'"
          return 0
        }
      
        rvm_install_gpg_setup ||
        {
          log "Found PGP signature at: '$1',
      but no GPG software exists to validate it, skipping."
          return 0
        }
      
        verify_package_pgp "${rvm_archives_path}/$2" "${rvm_archives_path}/$2.asc" "$1"
      }
      
      get_and_unpack()
      {
        typeset _url _file _patern _return _verify_pgp
        _url="$1"
        _file="$2"
        _verify_pgp="$3"
      
        get_package "$_url" "$_file" || return $?
        verify_pgp "$_verify_pgp" "$_file" || return $?
      
        [[ -d "${rvm_src_path}/rvm" ]] || \mkdir -p "${rvm_src_path}/rvm"
        __rvm_cd "${rvm_src_path}/rvm" ||
        {
          _return=$?
          log "Could not change directory '${rvm_src_path}/rvm'."
          return $_return
        }
      
        # Remove existing installation
        typeset _cleanup_cmd
        _cleanup_cmd="rm -rf ${rvm_src_path}/rvm/{,.[!.],..?}*"
      
        $_cleanup_cmd || {
          _return=$?
            log "Could not remove old RVM sources. Try:\n\n\tsudo $_cleanup_cmd\n\nThen retry your task again."
            return $_return
        }
      
        # Unpack sources
        __rvm_debug_command $rvm_tar_command xzf ${rvm_archives_path}/${_file} ${rvm_tar_options:-} --strip-components 1 ||
        {
          _return=$?
          log "Could not extract RVM sources."
          return $_return
        }
      }
      
      rvm_install_default_settings()
      {
        # Tracing, if asked for.
        if
          [[ "$*" == *--trace* ]] || (( ${rvm_trace_flag:-0} > 0 ))
        then
          set -o xtrace
          rvm_trace_flag=1
        fi
      
        # Variable initialization, remove trailing slashes if they exist on HOME
        true \
          ${rvm_trace_flag:=0} ${rvm_debug_flag:=0}\
          ${rvm_ignore_rvmrc:=0} HOME="${HOME%%+(\/)}"
      
        if
          (( rvm_ignore_rvmrc == 0 ))
        then
          for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
          do
            if
              [[ -s "$rvmrc" ]]
            then
              if
                GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
              then
                printf "%b" "
        Error: $rvmrc is for rvm settings only.
        rvm CLI may NOT be called from within $rvmrc.
        Skipping the loading of $rvmrc
        "
                exit 1
              else
                source "$rvmrc"
              fi
            fi
          done
        fi
      
        if
          [[ -z "${rvm_path:-}" ]]
        then
          if
            (( UID == 0 ))
          then
            rvm_user_install_flag=0
            rvm_prefix="/usr/local"
            rvm_path="${rvm_prefix}/rvm"
          else
            rvm_user_install_flag=1
            rvm_prefix="$HOME"
            rvm_path="${rvm_prefix}/.rvm"
          fi
        fi
        if [[ -z "${rvm_prefix}" ]]
        then rvm_prefix=$( dirname $rvm_path )
        fi
      
        # duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
        [[ -n "${rvm_user_install_flag:-}" ]] ||
        case "$rvm_path" in
          (/usr/local/rvm)         rvm_user_install_flag=0 ;;
          ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
          (*)                      rvm_user_install_flag=0 ;;
        esac
      }
      
      rvm_install_parse_params()
      {
        install_rubies=()
        install_gems=()
        flags=( ./scripts/install )
        forwarded_flags=()
        while
          (( $# > 0 ))
        do
          token="$1"
          shift
          case "$token" in
      
            (--trace)
              set -o xtrace
              rvm_trace_flag=1
              flags=( -x "${flags[@]}" "$token" )
              forwarded_flags+=( "$token" )
              ;;
      
            (--debug|--quiet-curl)
              flags+=( "$token" )
              forwarded_flags+=( "$token" )
              token=${token#--}
              token=${token//-/_}
              export "rvm_${token}_flag"=1
              printf "%b" "Turning on ${token/_/ } mode.\n"
              ;;
      
            (--path)
              if [[ -n "${1:-}" ]]
              then
                rvm_path="$1"
                shift
              else
                fail "--path must be followed by a path."
              fi
              ;;
      
            (--branch|branch) # Install RVM from a given branch
              if [[ -n "${1:-}" ]]
              then
                case "$1" in
                  (/*)
                    branch=${1#/}
                    ;;
                  (*/)
                    branch=master
                    if [[ "${1%/}" -ne rvm ]] && [[ "${1%/}" -ne mpapis ]]
                    then sources=(github.com/${1%/}/rvm)
                    fi
                    ;;
                  (*/*)
                    branch=${1#*/}
                    if [[ "${1%%/*}" -ne rvm ]] && [[ "${1%%/*}" -ne mpapis ]]
                    then sources=(github.com/${1%%/*}/rvm)
                    fi
                    ;;
                  (*)
                    branch="$1"
                    ;;
                esac
                shift
              else
                fail "--branch must be followed by a branchname."
              fi
              ;;
      
            (--source|source)
              if [[ -n "${1:-}" ]]
              then
                if [[ "$1" = */*/* ]]
                then
                  sources=($1)
                  shift
                else
                  fail "--source must be in the format <domain>/<account>/<repo>."
                fi
              else
                fail "--source must be followed by a source."
              fi
              ;;
      
            (--user-install|--ignore-dotfiles)
              token=${token#--}
              token=${token//-/_}
              export "rvm_${token}_flag"=1
              printf "%b" "Turning on ${token/_/ } mode.\n"
              ;;
      
            (--auto-dotfiles)
              flags+=( "$token" )
              export "rvm_auto_dotfiles_flag"=1
              printf "%b" "Turning on auto dotfiles mode.\n"
              ;;
      
            (--auto)
              export "rvm_auto_dotfiles_flag"=1
              printf "%b" "Warning, --auto is deprecated in favor of --auto-dotfiles.\n"
              ;;
      
            (--verify-downloads)
              if [[ -n "${1:-}" ]]
              then
                export rvm_verify_downloads_flag="$1"
                forwarded_flags+=( "$token" "$1" )
                shift
              else
                fail "--verify-downloads must be followed by level(0|1|2)."
              fi
              ;;
      
            (--autolibs=*)
              flags+=( "$token" )
              export rvm_autolibs_flag="${token#--autolibs=}"
              forwarded_flags+=( "$token" )
              ;;
      
            (--without-gems=*|--with-gems=*|--with-default-gems=*)
              flags+=( "$token" )
              value="${token#*=}"
              token="${token%%=*}"
              token="${token#--}"
              token="${token//-/_}"
              export "rvm_${token}"="${value}"
              printf "%b" "Installing RVM ${token/_/ }: ${value}.\n"
              ;;
      
            (--version|version)
              version="$1"
              shift
              ;;
      
            (head|master)
              version="head"
              branch="master"
              ;;
      
            (stable)
              version="latest"
              ;;
      
            (latest|latest-*|+([[:digit:]]).+([[:digit:]]).+([[:digit:]]))
              version="$token"
              ;;
      
            (--ruby)
              install_rubies+=( ruby )
              ;;
      
            (--ruby=*)
              token=${token#--ruby=}
              install_rubies+=( ${token//,/ } )
              ;;
      
            (--rails)
              install_gems+=( rails )
              ;;
      
            (--gems=*)
              token=${token#--gems=}
              install_gems+=( ${token//,/ } )
              ;;
      
            (--add-to-rvm-group)
              export rvm_add_users_to_rvm_group="$1"
              shift
              ;;
      
            (help)
              usage
              exit 0
              ;;
      
            (*)
              usage
              exit 1
              ;;
      
          esac
        done
      
        if (( ${#install_gems[@]} > 0 && ${#install_rubies[@]} == 0 ))
        then install_rubies=( ruby )
        fi
      
        true "${version:=head}"
        true "${branch:=master}"
      
        if [[ -z "${sources[@]}" ]]
        then sources=("${DEFAULT_SOURCES[@]}")
        fi
      
        rvm_src_path="$rvm_path/src"
        rvm_archives_path="$rvm_path/archives"
        rvm_releases_url="https://rvm.io/releases"
      }
      
      rvm_install_validate_rvm_path()
      {
        case "$rvm_path" in
          (*[[:space:]]*)
            printf "%b" "
      It looks you are one of the happy *space* users (in home dir name),
      RVM is not yet fully ready for it, use this trick to fix it:
      
          sudo mkdir -p /${USER// /_}.rvm
          sudo chown -R \"$USER:\" /${USER// /_}.rvm
          echo \"export rvm_path=/${USER// /_}.rvm\" >> \"$HOME/.rvmrc\"
      
      and start installing again.
      
      "
            exit 2
          ;;
          (/usr/share/ruby-rvm)
            printf "%b" "
      It looks you are one of the happy Ubuntu users,
      RVM packaged by Ubuntu is old and broken,
      follow this link for details how to fix:
      
        https://stackoverflow.com/a/9056395/497756
      
      "
            [[ "${rvm_uses_broken_ubuntu_path:-no}" == "yes" ]] || exit 3
          ;;
        esac
      
        if [[ "$rvm_path" != "/"* ]]
        then fail "The rvm install path must be fully qualified. Tried $rvm_path"
        fi
      }
      
      rvm_install_validate_volume_mount_mode()
      {
        \typeset path partition test_exec
      
        path=$rvm_path
      
        # Directory $rvm_path might not exists at this point so we need to traverse the tree upwards
        while [[ -n "$path" ]]
        do
            if [[ -d $path ]]
            then
              partition=`df -P $path | awk 'END{print $1}'`
      
              test_exec=$(mktemp $path/rvm-exec-test.XXXXXX)
              echo '#!/bin/sh' > "$test_exec"
              chmod +x "$test_exec"
      
              if ! "$test_exec"
              then
                rm -f "$test_exec"
                printf "%b" "
      It looks that scripts located in ${path}, which would be RVM destination ${rvm_path},
      are not executable. One of the reasons might be that partition ${partition} holding this location
      is mounted in *noexec* mode, which prevents RVM from working correctly. Please verify your setup
      and re-mount partition ${partition} without the noexec option."
                exit 2
              fi
      
              rm -f "$test_exec"
              break
            fi
      
            path=${path%/*}
        done
      }
      
      rvm_install_select_and_get_version()
      {
        typeset dir _version_release _version
      
        for dir in "$rvm_src_path" "$rvm_archives_path"
        do
          [[ -d "$dir" ]] || mkdir -p "$dir"
        done
      
        _version_release="${version}"
        case "${version}" in
          (head)
            _version_release="${branch}"
            install_head sources[@] ${branch:-master}
            ;;
      
          (latest)
            _version=$(fetch_version sources[@])
            install_release sources[@] "$_version"
            ;;
      
          (latest-minor)
            version="$(<"$rvm_path/VERSION")"
            _version=$(fetch_version sources[@] ${version%.*})
            install_release sources[@] "$_version"
            ;;
      
          (latest-*)
            _version=$(fetch_version sources[@] ${version#latest-})
            install_release sources[@] "$_version"
            ;;
      
          (+([[:digit:]]).+([[:digit:]]).+([[:digit:]])) # x.y.z
            install_release sources[@] ${version}
            ;;
      
          (*)
            fail "Something went wrong, unrecognized version '$version'"
            ;;
        esac
        echo "${_version_release}" > "$rvm_path/RELEASE"
      }
      
      rvm_install_main()
      {
        [[ -f ./scripts/install ]] ||
        {
          log "'./scripts/install' can not be found for installation, something went wrong, it usually means your 'tar' is broken, please report it here: https://github.com/rvm/rvm/issues"
          return 127
        }
      
        # required flag - path to install
        flags+=( --path "$rvm_path" )
        \command bash "${flags[@]}"
      }
      
      rvm_install_ruby_and_gems()
      (
        if
          (( ${#install_rubies[@]} > 0 ))
        then
          source ${rvm_scripts_path:-${rvm_path}/scripts}/rvm
          source ${rvm_scripts_path:-${rvm_path}/scripts}/functions/version
          __rvm_print_headline
      
          for _ruby in ${install_rubies[@]}
          do command rvm "${forwarded_flags[@]}" install ${_ruby}
          done
          # set the first one as default, skip rest
          for _ruby in ${install_rubies[@]}
          do
            rvm "${forwarded_flags[@]}" alias create default ${_ruby}
            break
          done
      
          for _gem in ${install_gems[@]}
          do rvm "${forwarded_flags[@]}" all do gem install ${_gem}
          done
      
          printf "%b" "
        * To start using RVM you need to run \`source $rvm_path/scripts/rvm\`
          in all your open shell windows, in rare cases you need to reopen all shell windows.
      "
      
          if
            [[ "${install_gems[*]}" == *"rails"* ]]
          then
            printf "%b" "
        * To start using rails you need to run \`rails new <project_dir>\`.
      "
          fi
        fi
      )
      
      rvm_install()
      {
        rvm_install_initialize
        rvm_install_commands_setup
        rvm_install_default_settings
        rvm_install_parse_params "$@"
        rvm_install_validate_rvm_path
        rvm_install_validate_volume_mount_mode
        rvm_install_select_and_get_version
        rvm_install_main
        rvm_install_ruby_and_gems
      }
      
      rvm_install "$@"
      
  • 在命令行里执行这个文件

    $ chmod +x install.sh
    $ sh install.sh
    
  • 执行完这个脚本,检查一下rvm版本

    $ rvm -v
    rvm 1.29.12-next (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
    

    最终升级成功

  • 总结

    • 升级rvm的原理、就是执行一个脚本
    • 如果常规升级总是报错,就要绕过那个步骤,自己手动去升级
    • 经过这次尝试感觉很多的升级都可以这么搞,比如安装oh-my-zsh
    • 升级完rvm就开始升级 ruby环境、升级cocoapods、最终flutter的项目跑起来了!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容